Spanner-Transaktionen bieten zwei Modi für die Nebenläufigkeitserkennung: pessimistisch und optimistisch. Die Wahl des Modus für die Nebenläufigkeitserkennung wirkt sich darauf aus, wie Transaktionen gleichzeitige Lese- und Schreibvorgänge verarbeiten. Dies beeinflusst die Leistung, die Latenz und die Transaktionsabbruchraten. Wählen Sie den Modus aus, der am besten zu den Leistungs- und Konsistenzanforderungen Ihrer Anwendung passt.
Das Standardverhalten hängt von der Isolationsebene ab, die Ihre Transaktion verwendet:
- Bei der serialisierbaren Isolation wird standardmäßig die pessimistische Nebenläufigkeitserkennung verwendet.
- Bei der Isolation wiederholbarer Lesevorgänge, wird standardmäßig die optimistische Nebenläufigkeitserkennung verwendet.
Pessimistische Nebenläufigkeitserkennung
Standardmäßig verwendet Spanner die pessimistische Gleichzeitigkeitserkennung mit serialisierbarer Isolation. Sie können die pessimistische Gleichzeitigkeitserkennung auch mit der Isolation wiederholbarer Lesevorgänge verwenden.
Pessimistische Gleichzeitigkeitserkennung bei serialisierbarer Isolation
In diesem Modus wird davon ausgegangen, dass gleichzeitige Transaktionen um dieselben Daten konkurrieren. Sperren werden proaktiv für Daten abgerufen, wenn sie innerhalb einer Transaktion gelesen oder geschrieben werden. Außerdem wird geprüft, ob Sperren, die früher in der Transaktion abgerufen wurden, in späteren Anweisungen beibehalten werden. Wenn Spanner einen Sperrenkonflikt erkennt, wird der Konflikt mit dem Wound-Wait-Algorithmus gelöst.
Bei der pessimistischen Nebenläufigkeit rufen Transaktionen Sperren für Daten sowohl während der Ausführungs- als auch der Commit-Phase der Transaktion ab.
- Für Lesevorgänge:Wenn eine Transaktion Daten liest, wird während der Ausführungsphase eine
gemeinsame Lesesperre (
ReaderShared) abgerufen. Diese Sperren werden beibehalten, bis die Transaktion mit Commit bestätigt wird. - Für DML und Schreibvorgänge
- Während der Ausführung ruft die Transaktion für Daten, die durch DML oder Schreibvorgänge geändert wurden, möglicherweise Lesesperren für die Existenz von Zeilen ab.
- Zum Zeitpunkt des Commits versucht die Transaktion, Schreib- oder exklusive Sperren für die geschriebenen Daten abzurufen. Schreibsperren blockieren gleichzeitige Lesevorgänge, aber möglicherweise nicht gleichzeitige Schreibvorgänge, insbesondere wenn beide Schreibsperren verwenden. Das bedeutet, dass mehrere Transaktionen mit Commit bestätigt werden können und Schreib-Schreib-Konflikte zum Zeitpunkt des Commits mit dem Wound-Wait-Algorithmus gelöst werden. Alle Sperren werden beibehalten, bis die Transaktion mit Commit bestätigt wird.
Pessimistische Nebenläufigkeit bei Isolation wiederholbarer Lesevorgänge
Verwenden Sie die pessimistische Gleichzeitigkeitserkennung bei der Isolation wiederholbarer Lesevorgänge, um Schreibvorgänge zu serialisieren. In diesem Modus verwenden Lesevorgänge Snapshots, aber
exklusive Sperren
gelten für Daten, die aus FOR UPDATE Abfragen oder
lock_scanned_ranges=exclusive Hinweisen gelesen wurden, und für Daten, die mit DML-Abfragen geschrieben wurden.
Vorteile der pessimistischen Nebenläufigkeit mit serialisierbarer Isolation
Der Hauptvorteil der pessimistischen Nebenläufigkeit mit serialisierbarer Isolation besteht darin, dass sie bei stark umkämpften Arbeitslasten dazu beiträgt, dass Transaktionen vorankommen. Spanner priorisiert bei Konflikten ältere Transaktionen gegenüber neueren. So wird sichergestellt, dass Transaktionen schließlich abgeschlossen werden, und die Anzahl der wiederholten Transaktionsabbrüche wird reduziert.
Vorteile der pessimistischen Gleichzeitigkeitserkennung mit Isolation wiederholbarer Lesevorgänge
Bei der Isolation wiederholbarer Lesevorgänge können Transaktionen, die Sperren abrufen, zum Zeitpunkt des Commits dennoch abgebrochen werden, wenn die Daten, die als Teil einer Abfrage mit FOR UPDATE oder als Teil einer DML-Abfrage gelesen wurden, von einer gleichzeitigen Transaktion geändert wurden, bevor die Transaktion mit Commit bestätigt wird. Nachdem Sperren abgerufen wurden, werden jedoch weitere gleichzeitige Aktualisierungen verhindert, bis die Transaktion mit Commit bestätigt wird. So werden die Schreibvorgänge serialisiert.
Risiken der pessimistischen Nebenläufigkeit
Pessimistische Nebenläufigkeit mit serialisierbarer Isolation birgt die folgenden Risiken:
- Lange Lesevorgänge können latenzempfindliche Schreibvorgänge blockieren.
- Transaktionen, die vor dem Abschluss eine Nutzerinteraktion erfordern, können dazu führen, dass Sperren lange beibehalten werden, wodurch möglicherweise andere Vorgänge blockiert werden.
Anwendungsfälle für die pessimistische Nebenläufigkeit mit serialisierbarer Isolation
Die pessimistische Gleichzeitigkeitserkennung eignet sich für Arbeitslasten mit hoher Konkurrenz bei Lese-Schreib- und Schreib-Schreib-Vorgängen. Sie ist auch geeignet, wenn Transaktionsabbrüche und -wiederholungen kostspielig sind. Verwenden Sie diesen Standardmodus, es sei denn, Ihre Arbeitslast weist übermäßig lange Sperrenverzögerungen auf oder ist erheblich von Sperrenkonflikten betroffen.
Anwendungsfälle für die pessimistische Nebenläufigkeit mit Isolation wiederholbarer Lesevorgänge
Verwenden Sie die pessimistische Nebenläufigkeit mit wiederholbarem Lesen für Arbeitslasten, für die eine FOR UPDATE-Klausel oder DML-Abfragen zum Abrufen von Sperren erforderlich sind. Dieser Ansatz ist besonders nützlich für Arbeitslasten, die aus anderen Datenbanken zu Spanner migriert wurden und für diese Anweisungen Sperren abrufen.
Optimistische Nebenläufigkeitserkennung
Spanner bietet auch eine optimistische Nebenläufigkeitserkennung. Wenn Sie die Isolation wiederholbarer Lesevorgänge verwenden, ist der Standardmodus die optimistische Gleichzeitigkeitserkennung. Sie können auch die serialisierbare Isolation so konfigurieren, dass die optimistische Nebenläufigkeitserkennung verwendet wird.
Bei der optimistischen Nebenläufigkeitserkennung wird davon ausgegangen, dass Konflikte selten sind. Lese- und Abfragevorgänge werden auch innerhalb einer Lese-Schreib-Transaktion ohne Abrufen von Sperren ausgeführt.
Bei der standardmäßigen serialisierbaren Isolation von Spanner werden Lesevorgänge zum Zeitpunkt des Commits validiert. So wird sichergestellt, dass keine andere gleichzeitig mit Commit bestätigte Transaktion die zuvor von der Transaktion gelesenen Daten geändert hat. Wenn Sie
die Isolation wiederholbarer Lesevorgänge,
Lesevorgänge mit einem FOR UPDATE oder lock_scanned_ranges=exclusive Hinweis zum Zeitpunkt des Commits
validiert werden. Wenn Spanner einen Konflikt erkennt, wird die Transaktion abgebrochen.
Funktionsweise der optimistischen Gleichzeitigkeitserkennung
Die optimistische Nebenläufigkeit ändert die Art und Weise, wie Spanner Lesevorgänge, Abfragen und Transaktions-Commits ausführt. Während der Lesevorgänge werden keine Sperren verwendet und die Konsistenz wird beim Commit validiert.
Für Lese- und Abfragevorgänge
Für Lese- und Abfragevorgänge werden keine Sperren verwendet. Alle Lese- und Abfragevorgänge innerhalb einer optimistischen Transaktion werden mit einem einzelnen Snapshot-Zeitstempel ausgeführt. Spanner wählt diesen Zeitstempel aus, wenn der erste Lese- oder Abfragevorgang ausgeführt wird. So wird sichergestellt, dass bei allen nachfolgenden Lese- und Abfragevorgängen innerhalb der Transaktion Schreibvorgänge berücksichtigt werden, die vor dem ersten Lese- oder Abfragevorgang mit Commit bestätigt wurden.
Für Lese- und Schreibvorgänge
Bei einer optimistischen Transaktion mit Lese- und Schreibvorgängen führt Spanner zum Zeitpunkt des Commits einen Validierungsschritt aus. Die Transaktion wird nur dann mit Commit bestätigt, wenn keine Konflikte erkannt werden und die folgenden Bedingungen erfüllt sind:
- Es gibt keine gleichzeitig mit Commit bestätigten Schreibvorgänge, die mit den von dieser Transaktion gelesenen Daten in Konflikt stehen. Das heißt, es wurden keine Schreibvorgänge nach dem Zeitstempel des Lesevorgangs, aber vor dem Commit der eigenen Schreibvorgänge dieser Transaktion ausgeführt.
- Das Schema wurde seit dem Zeitstempel des Lesevorgangs nicht geändert.
Die Isolationsebene bestimmt die Menge der Lesevorgänge, die validiert werden. Bei der serialisierbaren Isolation werden alle Lesevorgänge validiert. Bei der Isolation wiederholbarer Lesevorgänge werden Lesevorgänge mit einem FOR UPDATE- oder lock_scanned_ranges=exclusive-Hinweis zum Zeitpunkt des Commits validiert.
Bei hoher Konkurrenz können optimistische Transaktionen wiederholt abgebrochen werden. Im Gegensatz dazu werden bei pessimistischen Transaktionen Lese-Schreib-Konflikte gelöst, indem die ältere Transaktion mit Commit bestätigt und die neuere Transaktion wiederholt wird.
Vorteile der optimistischen Gleichzeitigkeitserkennung
Die optimistische Nebenläufigkeit bietet die folgenden Vorteile:
- Für Lesevorgänge werden keine Sperren abgerufen: Bei optimistischen Transaktionen werden für Lesevorgänge keine Sperren abgerufen. Lange Lesevorgänge blockieren also keine latenzempfindlichen Schreibvorgänge.
- Reduzierte Commit-Latenz für schreibgeschützte Transaktionen: Da alle Lesevorgänge innerhalb einer optimistischen Transaktion auf demselben Snapshot-Zeitstempel basieren, ist es nicht erforderlich, die Konsistenz während der Ausführung oder des Commits für diese Lesevorgänge zu überprüfen. Dadurch wird die Latenz erheblich reduziert.
Risiken der optimistischen Nebenläufigkeit
Die optimistische Gleichzeitigkeitserkennung birgt Risiken, insbesondere bei hoher Konkurrenz bei Lese-Schreib-Vorgängen, wenn sie mit serialisierbarer Isolation verwendet wird. Sie sollten diese Risiken kennen, bevor Sie die optimistische Nebenläufigkeitserkennung mit serialisierbarer Isolation für Ihre Arbeitslast verwenden.
- Bei hoher Konkurrenz bei Lese-Schreib-Vorgängen kann es bei optimistischen Transaktionen zu einer hohen Abbruchrate kommen, da gleichzeitige Schreibvorgänge die Lesevorgänge einer optimistischen Transaktion ungültig machen können.
- Bei anhaltend hoher Konkurrenz kann eine Transaktion wiederholt abgebrochen werden und aufgrund von Transaktionsmangel nie mit Commit bestätigt werden.
Anwendungsfälle für die optimistische Gleichzeitigkeitserkennung
Die optimistische Nebenläufigkeit eignet sich für transaktionale Arbeitslasten mit geringer Konkurrenz bei Lese-Schreib-Vorgängen. Bei serialisierbaren Transaktionen ist sie auch für Arbeitslasten von Vorteil, bei denen Transaktionsabbrüche toleriert werden können.
Erwägen Sie die optimistische Nebenläufigkeit für die folgenden Arbeitslasten:
- Arbeitslasten mit niedriger Priorität und Latenztoleranz mit langen Transaktionen:Verwenden Sie die optimistische Nebenläufigkeit, wenn lange Lese- oder Abfragevorgänge latenzempfindliche Schreibvorgänge verzögern könnten. So werden Verzögerungen durch Lesesperren vermieden. Beispiele sind Transaktionen in mobilen Clients mit langsamen Verbindungen oder Transaktionen mit niedriger SLA, die Lesesperren für viele Zeilen oder große Bereiche beibehalten.
- Transaktionale Arbeitslasten mit geringer Konkurrenz bei Lese-Schreib-Vorgängen, die latenzempfindlich sind Verwenden Sie in einer multiregionalen Konfiguration die optimistische Nebenläufigkeit, um Lesevorgänge regional auszuführen, die Leselatenzen zu reduzieren und Produktionsprobleme durch unregelmäßigen Lesetraffic zu einem Hot Split zu vermeiden. Außerdem wird die Leseverfügbarkeit bei Überlastung oder Nichtverfügbarkeit des Leaders verbessert.
- Transaktionale Arbeitslasten, bei denen die meisten Transaktionen schreibgeschützt sind:Durch den Wechsel zur optimistischen Nebenläufigkeit wird die Commit-Latenz für häufige schreibgeschützte Transaktionen in diesen Arbeitslasten reduziert. Achten Sie auf eine geringe Konkurrenz bei Lese-Schreib-Vorgängen, um hohe Abbruchraten für Lese-Schreib-Transaktionen zu vermeiden.
Vermeiden Sie die Verwendung der optimistischen Nebenläufigkeit für latenzempfindliche transaktionale Arbeitslasten, bei denen häufig Lese-Schreib-Konflikte auftreten.
Nebenläufigkeitserkennung konfigurieren
Sie können die Spanner-Clientbibliotheken, die REST API und die RPC API verwenden, um den Modus für die Nebenläufigkeit für Lese-Schreib-Transaktionen anzugeben.
Clientbibliotheken
Java
Go
Node.js
Python
C#
C++
PHP
Ruby
REST
Die Spanner TransactionOptions
REST API bietet eine ReadLockMode Enumeration in der ReadWrite Nachricht, mit der Sie
entweder den Sperrenmodus PESSIMISTIC oder OPTIMISTIC auswählen können.
RPC
Die Spanner Transactionoptions
RPC API bietet eine ReadLockMode Enumeration in der ReadWrite Nachricht, mit der Sie entweder den Sperrenmodus PESSIMISTIC oder OPTIMISTIC auswählen können.
Erfolgsfaktoren
Mit den Spanner-Treibern können Sie read_lock_mode auf Verbindungsebene als Verbindungsparameter oder auf Transaktionsebene als SET-Anweisungsoption festlegen. Weitere Informationen zu den einzelnen Treibern finden Sie unter
Übersicht über Treiber.
Nächste Schritte
- Weitere Informationen zu den Isolationsebenen von Spanner
- Isolation wiederholbarer Lesevorgänge verwenden