Spanner-Transaktionen bieten zwei Modi für die Parallelitätssteuerung: pessimistisch und optimistisch. Die Wahl des Modus für die Nebenläufigkeitssteuerung 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 Parallelitätssteuerung 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. In diesem Modus wird davon ausgegangen, dass konkurrierende Transaktionen um dieselben Daten konkurrieren können. Es werden Sperren proaktiv 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 erwerben.
- Beim Commit 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.
Vorteile der pessimistischen Parallelität 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.
Risiken der pessimistischen Gleichzeitigkeitserkennung
Die pessimistische Parallelität 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
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.
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 Parallelitätssteuerung 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 Konfliktwahrscheinlichkeit 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. Dadurch wird die Latenz erheblich reduziert.
Risiken der optimistischen Gleichzeitigkeitserkennung
Die optimistische Parallelität birgt Risiken, insbesondere bei hoher Lese-/Schreibkonkurrenz in Verbindung mit serialisierbarer Isolation. Machen Sie sich mit diesen Risiken vertraut, bevor Sie die optimistische Parallelitätssteuerung 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 Parallelität, 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, bei denen die Leselatenz wichtig ist: Verwenden Sie in einer multiregionalen Konfiguration optimistische Parallelität, um Lesevorgänge regional auszuführen, Leselatenzen zu reduzieren und Produktionsprobleme durch Spitzen beim Lesetraffic für einen 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 Parallelität 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 Gleichzeitigkeitserkennung 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#
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