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 Leistung, Latenz und Transaktionsabbrüche. Wählen Sie den Modus aus, der den Leistungs- und Konsistenzanforderungen Ihrer Anwendung am besten entspricht.
Das Standardverhalten hängt von der Isolationsstufe ab, die für Ihre Transaktion verwendet wird:
- Bei der serialisierbaren Isolation wird standardmäßig die pessimistische Nebenläufigkeitserkennung verwendet.
- Für die Isolation vom Typ „Repeatable Read“ wird standardmäßig die optimistische Nebenläufigkeitserkennung verwendet.
Pessimistische Nebenläufigkeitserkennung
Standardmäßig verwendet Spanner pessimistische Parallelität mit Isolation zur Serialisierbarkeit. Sie können auch pessimistische Parallelität mit wiederholbarer Leseisolation verwenden.
Pessimistische Parallelität bei serialisierbarer Isolation
In diesem Modus wird davon ausgegangen, dass konkurrierende Transaktionen um dieselben Daten konkurrieren können. Es werden proaktiv Sperren für Daten abgerufen, wenn diese innerhalb einer Transaktion gelesen oder geschrieben werden. Außerdem wird geprüft, ob Sperren, die früher in der Transaktion erworben wurden, in späteren Anweisungen weiterhin gehalten werden. Wenn Spanner einen Sperrkonflikt erkennt, wird der Konflikt mit dem Wound-Wait-Algorithmus behoben.
Bei der pessimistischen Nebenläufigkeit werden während der Ausführungs- und Commit-Phase der Transaktion Sperren für Daten abgerufen.
- Lesevorgänge:Wenn eine Transaktion Daten liest, wird während der Ausführungsphase eine gemeinsame Lesesperre (
ReaderShared) abgerufen. Diese Sperren werden bis zum Commit der Transaktion beibehalten. - 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 werden, Lesesperren für die Existenz von Zeilen übernehmen.
- Zum Zeitpunkt des Commits versucht die Transaktion, Schreib- oder exklusive Sperren für die geschriebenen Daten zu erwerben. Schreibsperren blockieren gleichzeitige Lesevorgänge, aber möglicherweise nicht gleichzeitige Schreibvorgänge, insbesondere wenn beide Schreibsperren verwenden. Das bedeutet, dass mehrere Transaktionen committet werden können und Schreib-/Schreibkonflikte zur Commit-Zeit mit dem Wound-Wait-Algorithmus behoben werden. Alle Sperren werden bis zum Commit der Transaktion beibehalten.
Pessimistische Parallelität bei der Isolationsebene „Wiederholbarer Lesevorgang“
Verwenden Sie pessimistische Parallelität bei der Isolation wiederholbarer Lesevorgänge, um Schreibvorgänge zu serialisieren. In diesem Modus werden für Lesevorgänge Snapshots verwendet, aber exklusive Sperren gelten für Daten, die mit FOR UPDATE-Abfragen oder lock_scanned_ranges=exclusive-Hinweisen gelesen werden, und für Daten, die mit DML-Abfragen geschrieben werden.
Vorteile der pessimistischen Nebenläufigkeit mit serialisierbarer Isolation
Der Hauptvorteil der Verwendung von pessimistischer Nebenläufigkeit mit serialisierbarer Isolation besteht darin, dass Transaktionen bei stark umkämpften Arbeitslasten besser vorankommen. Bei Konflikten priorisiert Spanner ältere Transaktionen gegenüber neueren. So wird dafür gesorgt, dass Transaktionen schließlich abgeschlossen werden, und die Anzahl der wiederholten Abbrüche von Transaktionen wird reduziert.
Vorteile der pessimistischen Parallelität mit der Isolationsebene „Repeatable Read“
Bei der Isolationsebene „Wiederholbarer Lesevorgang“ können Transaktionen, die Sperren erhalten, beim Commit weiterhin 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 committet wird. Dadurch werden die Schreibvorgänge serialisiert.
Risiken der pessimistischen Nebenläufigkeit
Die pessimistische Nebenläufigkeit mit serialisierbarer Isolation birgt die folgenden Risiken:
- Lange Lesevorgänge können latenzempfindliche Schreibvorgänge blockieren.
- Bei Transaktionen, die vor dem Abschluss eine Nutzerinteraktion erfordern, können Sperren lange aufrechterhalten werden, was möglicherweise andere Vorgänge blockiert.
Anwendungsfälle für pessimistische Parallelität mit serialisierbarer Isolation
Die pessimistische Nebenläufigkeit eignet sich für Arbeitslasten mit hohem Lese-/Schreib- und Schreib-/Schreibkonflikt. Das ist auch dann sinnvoll, wenn Transaktionsabbrüche und ‑wiederholungen kostspielig sind. Verwenden Sie diesen Standardmodus, es sei denn, Ihre Arbeitslast weist übermäßig lange Sperrverzögerungen auf oder ist erheblich von Sperrkonflikten betroffen.
Anwendungsfälle für pessimistische Parallelität mit der Isolationsstufe „Repeatable Read“
Verwenden Sie die pessimistische Nebenläufigkeit mit „Repeatable Read“ für Arbeitslasten, für die eine FOR UPDATE-Klausel oder DML-Abfragen zum Erwerben von Sperren erforderlich sind. Dieser Ansatz ist besonders nützlich für Arbeitslasten, die aus anderen Datenbanken zu Spanner migriert wurden und Sperren für diese Anweisungen abrufen.
Optimistische Nebenläufigkeitserkennung
Spanner bietet auch eine optimistische Nebenläufigkeitserkennung. Wenn Sie die Isolierung „Wiederholbares Lesen“ verwenden, ist der Standardmodus die optimistische Gleichzeitigkeitserkennung. Sie können die serialisierbare Isolation auch 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 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 übergebene Transaktion die Daten geändert hat, die zuvor von der Transaktion gelesen wurden. Wenn Sie die Isolation wiederholbarer Lesevorgänge verwenden, werden Lesevorgänge mit dem Hinweis FOR UPDATE oder lock_scanned_ranges=exclusive zum Zeitpunkt des Commits validiert. Wenn Spanner einen Konflikt erkennt, wird die Transaktion abgebrochen.
Funktionsweise der optimistischen Gleichzeitigkeitserkennung
Die optimistische Nebenläufigkeit ändert die Art und Weise, wie Spanner Lese- und Abfragevorgänge ausführt und Transaktionen committet. Sie führt die Ausführung während der Lesevorgangsphase ohne Sperren durch und validiert die Konsistenz beim Commit.
Für Lese- und Abfragevorgänge
Lese- und Abfragevorgänge sind nicht blockierend. Alle Lese- und Abfragevorgänge innerhalb einer optimistischen Transaktion werden zu 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 durchgeführt 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 übernommen, wenn keine Konflikte erkannt werden und die folgenden Bedingungen erfüllt sind:
- Es gibt keine gleichzeitig ausgeführten Commits, 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 Lesezeitstempel 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 dem Hinweis FOR UPDATE oder lock_scanned_ranges=exclusive zum Zeitpunkt des Commits validiert.
Bei hoher Auslastung können optimistische Transaktionen wiederholt abgebrochen werden. Bei pessimistischen Transaktionen werden Lese-/Schreibkonflikte dagegen dadurch behoben, dass die ältere Transaktion mit Commit bestätigt wird und die neuere Transaktion wiederholt wird.
Vorteile der optimistischen Gleichzeitigkeitserkennung
Die optimistische Parallelität bietet folgende Vorteile:
- Lesevorgänge erhalten keine Sperren: Optimistische Transaktionen erhalten keine Sperren für Lesevorgänge. Daher blockieren lang andauernde Lesevorgänge keine latenzsensitiven Schreibvorgänge.
- Geringere Commit-Latenz für schreibgeschützte Transaktionen: Da alle Lesevorgänge innerhalb einer optimistischen Transaktion auf demselben Snapshot-Zeitstempel basieren, muss die Konsistenz während der Ausführung oder des Commits für diese Lesevorgänge nicht überprüft werden. Das führt zu einer erheblichen Reduzierung der Latenz.
Risiken der optimistischen Nebenläufigkeit
Die optimistische Nebenläufigkeit birgt Risiken, insbesondere bei hoher Lese-/Schreibkonkurrenz in Verbindung mit serialisierbarer Isolation. Machen Sie sich mit diesen Risiken vertraut, bevor Sie die optimistische Nebenläufigkeitserkennung mit serialisierbarer Isolation für Ihre Arbeitslast verwenden.
- Bei hoher Lese-/Schreibkonkurrenz kann es bei optimistischen Transaktionen zu einer hohen Anzahl von Abbrüchen kommen, da gleichzeitige Schreibvorgänge die Lesevorgänge einer optimistischen Transaktion ungültig machen können.
- Bei anhaltend hoher Konfliktwahrscheinlichkeit kann es sein, dass eine Transaktion wiederholt abgebrochen wird und aufgrund von Transaktions-Starvation nie committet wird.
Anwendungsfälle für optimistische Gleichzeitigkeitserkennung
Optimistische Parallelität eignet sich für transaktionale Arbeitslasten mit geringen Lese-/Schreibkonflikten. Bei serialisierbaren Transaktionen profitieren auch Arbeitslasten, die Transaktionsabbrüche tolerieren können.
Erwägen Sie die optimistische Parallelität für die folgenden Arbeitslasten:
- Arbeitslasten mit niedriger Priorität und latenzunempfindlichen, lang andauernden Transaktionen:Verwenden Sie optimistische Nebenläufigkeit, wenn lang andauernde Lese- oder Abfragevorgänge latenzempfindliche Schreibvorgänge verzögern könnten. So werden Verzögerungen durch Lesesperren vermieden. Beispiele: Transaktionen in mobilen Clients mit langsamen Verbindungen oder Transaktionen mit niedrigem SLA, die Lesesperren für viele Zeilen oder große Bereiche enthalten.
- Transaktionale Arbeitslasten mit geringer Lese-/Schreibkonkurrenz und geringer Leselatenz: Verwenden Sie in einer multiregionalen Konfiguration optimistische Parallelität, um Lesevorgänge regional bereitzustellen, Leselatenzen zu reduzieren und Produktionsprobleme durch sprunghaften 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 die Umstellung auf optimistische Nebenläufigkeit wird die Commit-Latenz für häufige schreibgeschützte Transaktionen in diesen Arbeitslasten reduziert. Achten Sie auf geringe Konflikte bei Lese-/Schreibvorgängen, um hohe Abbruchraten für Lese-/Schreibtransaktionen zu vermeiden.
Vermeiden Sie die Verwendung der optimistischen Nebenläufigkeitserkennung für latenzempfindliche transaktionale Arbeitslasten, bei denen Lese-/Schreibkonflikte häufig auftreten.
Nebenläufigkeitserkennung konfigurieren
Sie können die Spanner-Clientbibliotheken, die REST API und die RPC API verwenden, um den Parallelitätsmodus für Lese-/Schreibtransaktionen anzugeben.
Clientbibliotheken
Java
Go
Node.js
Python
C#
C++
REST
Die Spanner TransactionOptions REST API bietet ein ReadLockMode-Enum in der ReadWrite-Nachricht, mit dem Sie entweder den PESSIMISTIC- oder den OPTIMISTIC-Sperrmodus auswählen können.
RPC
Die Spanner-RPC-API Transactionoptions bietet ein ReadLockMode-Enum innerhalb der ReadWrite-Nachricht, mit dem Sie entweder den PESSIMISTIC- oder den OPTIMISTIC-Sperrmodus auswählen können.
Erfolgsfaktoren
Sie können die Spanner-Treiber verwenden, um read_lock_mode als Verbindungsparameter auf Verbindungsebene oder als SET-Anweisungsoption auf Transaktionsebene festzulegen. Weitere Informationen zu den einzelnen Treibern finden Sie unter Übersicht über Treiber.
Nächste Schritte
- Weitere Informationen zu Spanner-Isolationsebenen
- Informationen zur Verwendung der Isolation wiederholbarer Lesevorgänge