Auf dieser Seite wird beschrieben, wie Sie die Isolation von wiederholbaren Lesevorgängen in Spanner verwenden.
„Repeatable Read“ ist eine Isolationsebene, die dafür sorgt, dass bei allen Lesevorgängen innerhalb einer Transaktion ein konsistenter Snapshot der Datenbank angezeigt wird, wie er zu Beginn der Transaktion vorhanden war. In Spanner wird diese Isolationsebene mit einer Technik implementiert, die auch als Snapshot-Isolation bezeichnet wird. Dieser Ansatz ist in Szenarien mit hoher Lese-/Schreibkonkurrenz von Vorteil, in denen zahlreiche Transaktionen Daten lesen, die von anderen Transaktionen geändert werden könnten. Durch die Verwendung eines festen Snapshots werden mit „Repeatable Read“ die Leistungseinbußen der strengeren Isolationsebene „Serializable“ vermieden. Lesevorgänge können ohne Sperren und ohne Blockierung gleichzeitiger Schreibvorgänge ausgeführt werden. Dies führt möglicherweise zu weniger abgebrochenen Transaktionen, die aufgrund von Serialisierungskonflikten wiederholt werden müssen. Weitere Informationen finden Sie unter Übersicht über Isolationsstufen.
Isolationsebene festlegen
Sie können die Isolationsebene für Lese-/Schreibtransaktionen auf Datenbankclient- oder Transaktionsebene mit den folgenden Methoden festlegen:
Clientbibliotheken
Go
Java
Node.js
Python
REST
Mit der TransactionOptions.isolation_level REST API können Sie die Isolationsebene für Lese-Schreib- und schreibgeschützte Transaktionen auf Transaktionsebene festlegen. Gültige Optionen sind TransactionOptions.SERIALIZABLE und TransactionOptions.REPEATABLE_READ. Standardmäßig wird die Isolationsebene in Spanner auf „serialisierbare Isolation“ festgelegt.
Beschränkungen
Für die Vorschau der Isolation „Wiederholbares Lesen“ gelten die folgenden Einschränkungen.
- Wenn Ihr Schema CHECK-Einschränkungen enthält, können Probleme auftreten.
- Es gibt ein bekanntes Problem, das verhindert, dass CHECK-Einschränkungen validiert werden. Dies kann zu Einschränkungsverletzungen führen, wenn Transaktionen committet werden. Daher empfehlen wir, die Isolation „Repeatable Read“ in der Vorschau nicht zu verwenden, wenn Ihr Schema Check-Einschränkungen enthält.
- Es kann zu Problemen kommen, wenn in Ihrer Datenbank gleichzeitig Schemata geändert werden, während Transaktionen ausgeführt werden.
- Wenn in Ihren DML-Anweisungen die Option
last_statementverwendet wird und während der Ausführung der DML-Anweisung eine gleichzeitige Schemaänderung erfolgt, wird möglicherweise intern ein Wiederholungsversuch unternommen und ein Fehler zurückgegeben, der besagt, dass die DML-Anweisung nach dem Festlegen der Optionlast_statementfälschlicherweise wiederholt wurde. Wenn Sie die Transaktion nach der Schemaänderung noch einmal versuchen, wird das Problem behoben. - Wenn bei Anfragen in einer Transaktion ein
DEADLINE_EXCEEDED-Fehler vom Client auftritt, wiederholen Sie die Transaktion, nachdem die Schemaänderung angewendet wurde, um das Problem zu beheben.
- Wenn in Ihren DML-Anweisungen die Option
Nicht unterstützte Anwendungsfälle
- Sie können die Isolationsebene „Wiederholbares Lesen“ nicht für partitionierte DML-Transaktionen festlegen.
- Alle schreibgeschützten Transaktionen werden bereits mit einem festen Snapshot ausgeführt und erfordern keine Sperren. Das Festlegen der Isolationsebene „REPEATABLE READ“ für diesen Transaktionstyp ändert also nichts.
- Sie können die Isolation vom Typ „Repeatable Read“ nicht für schreibgeschützte, einmalige und Partitionierungsvorgänge mit den Spanner-Clientbibliotheken festlegen. Die Spanner-Clientbibliotheken bieten keine Option zum Festlegen der Isolation vom Typ „Repeatable Read“ für schreibgeschützte, einmalige und Partitionierungsabfragevorgänge.
Nächste Schritte
Informationen zur Verwendung von SELECT FOR UPDATE in der Isolationsebene „Repeatable Read“
Weitere Informationen zur Serialisierbarkeit und externen Konsistenz von Spanner finden Sie unter TrueTime und externe Konsistenz.