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, und beeinflusst Leistung, Latenz und 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 übertragen wird. - Für DML- und Schreibvorgänge:
- Während der Ausführung kann die Transaktion für Daten, die durch DML oder Schreibvorgänge geändert wurden, Lesesperren für die Existenz von Zeilen abrufen.
- 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 übertragen 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 übertragen 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 werden für Lesevorgänge Snapshots verwendet. Es gelten jedoch
exklusive Sperren
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 Gleichzeitigkeitserkennung 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 weiterverarbeitet werden. 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, vor dem Commit der Transaktion von einer gleichzeitigen Transaktion geändert wurden. Nachdem Sperren abgerufen wurden, werden jedoch weitere gleichzeitige Aktualisierungen verhindert, bis die Transaktion mit Commit übertragen wird, wodurch die Schreibvorgänge serialisiert werden.
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 Lese-Schreib- und Schreib-Schreib-Konkurrenz. 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 Gleichzeitigkeitserkennung mit wiederholbaren Lesevorgängen 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 übertragene 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 Gleichzeitigkeitserkennung ändert die Art und Weise, wie Spanner Transaktionen liest, abfragt und mit Commit überträgt. Während der Lesevorgänge wird die Ausführung ohne Sperren durchgeführt und die Konsistenz wird zum Zeitpunkt des Commits validiert.
Für Lese- und Abfragevorgänge
Lese- und Abfragevorgänge werden ohne Sperren ausgeführt. 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 übertragen 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 erfolgreich mit Commit übertragen, wenn keine Konflikte erkannt werden und die folgenden Bedingungen erfüllt sind:
- Keine gleichzeitig mit Commit übertragenen Schreibvorgänge stehen im Konflikt mit den von dieser Transaktion gelesenen Daten. Das heißt, es wurden keine Schreibvorgänge nach dem Zeitstempel des Lesevorgangs, aber vor dem Commit der eigenen Schreibvorgänge dieser Transaktion mit Commit übertragen.
- 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 übertragen und die neuere Transaktion wiederholt wird.
Vorteile der optimistischen Gleichzeitigkeitserkennung
Die optimistische Gleichzeitigkeitserkennung bietet die folgenden Vorteile:
- Für Lesevorgänge werden keine Sperren abgerufen: Bei optimistischen Transaktionen werden für Lesevorgänge keine Sperren abgerufen, sodass lange Lesevorgänge latenzempfindliche Schreibvorgänge nicht blockieren.
- 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 Nebenläufigkeit birgt Risiken, insbesondere bei hoher Lese-Schreib-Konkurrenz, wenn sie mit serialisierbarer Isolation verwendet wird. Machen Sie sich mit diesen Risiken vertraut, bevor Sie die optimistische Nebenläufigkeitserkennung mit serialisierbarer Isolation für Ihre Arbeitslast verwenden.
- Bei hoher Lese-Schreib-Konkurrenz 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 übertragen werden.
Anwendungsfälle für die optimistische Gleichzeitigkeitserkennung
Die optimistische Nebenläufigkeit eignet sich für transaktionale Arbeitslasten mit geringer Lese-Schreib-Konkurrenz. Bei serialisierbaren Transaktionen ist sie auch für Arbeitslasten von Vorteil, bei denen Transaktionsabbrüche toleriert werden können.
Erwägen Sie die optimistische Gleichzeitigkeitserkennung für die folgenden Arbeitslasten:
- Arbeitslasten mit niedriger Priorität und hoher Latenz mit langen Transaktionen:Verwenden Sie die optimistische Nebenläufigkeit, wenn lange Lese- oder Abfragevorgänge latenzempfindliche Schreibvorgänge verzögern können. 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 Lese-Schreib-Konkurrenz, 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 Lese-Schreib-Konkurrenz, 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 Gleichzeitigkeitserkennung für Lese-Schreib-Transaktionen anzugeben.
Clientbibliotheken
Java
Los
Node.js
Python
C#
C++
PHP
Ruby
REST
Die Spanner TransactionOptions
REST API bietet eine ReadLockMode Enum 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 Enum 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