Eine Transaktion besteht aus einer Reihe von Vorgängen, die auf eine oder mehrere Entitäten angewendet werden. Jede Transaktion ist garantiert atomar, das heißt, Transaktionen werden niemals teilweise ausgeführt. Entweder werden alle Vorgänge in der Transaktion angewendet oder keiner.
Transaktionen verwenden
Transaktionen laufen nach 270 Sekunden oder bei einer Inaktivität von 60 Sekunden ab.
In folgenden Fällen kann ein Vorgang fehlschlagen:
- Es wurden zu viele gleichzeitige Änderungen an derselben Entität versucht.
- Die Transaktion überschreitet einen Ressourcengrenzwert.
- Die Datenbank im Datastore-Modus hat einen internen Fehler festgestellt.
In all diesen Fällen gibt die Datastore API einen Fehler zurück.
Transaktionen sind eine optionale Funktion. Sie müssen für Datenbankvorgänge keine Transaktionen verwenden.
In einer Anwendung kann ein Satz von Anweisungen und Vorgängen als Transaktion zusammengefasst und ausgeführt werden. Auf diese Weise wird keiner der Datenbankvorgänge ausgeführt, wenn von einer Anweisung oder einem Vorgang eine Ausnahme ausgelöst wird. Die als Transaktion auszuführenden Aktionen werden von der Anwendung definiert.
Das folgende Snippet zeigt, wie eine Transaktion ausgeführt wird. In diesem Beispiel wird Geld von einem Konto auf ein anderes überwiesen.
C#
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore C# API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Go
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Go API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Java
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Java API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Node.js
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Node.js API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
PHP
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore PHP API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Python
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Python API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Ruby
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Ruby API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Um unsere Beispiele möglichst kurz zu halten, lassen wir gelegentlich das rollback
weg, wenn die Transaktion fehlschlägt. Bei Produktionscode ist es wichtig, dass für jede Transaktion explizit entweder ein Commit oder ein Rollback durchgeführt wird.
Möglichkeiten in einer Transaktion
Mit Transaktionen können beliebig viele Entitäten abgefragt oder nachgeschlagen werden. Die maximale Größe einer Transaktion beträgt 10 MiB. Sie können eine Lese-Schreib-Transaktion oder eine schreibgeschützte Transaktion verwenden.
Isolation und Konsistenz
Datenbanken im Datastore-Modus erzwingen serialisierbare Isolierung. Daten, die von einer Transaktion gelesen oder geändert werden, können nicht gleichzeitig geändert werden.
Bei Abfragen und Lookups in einer Transaktion wird ein konsistenter Snapshot des Datenbankstatus angezeigt. Dieser Snapshot enthält garantiert die Auswirkungen aller Transaktionen und Schreibvorgänge, die vor Beginn der Transaktion abgeschlossen wurden.
Diese konsistente Snapshot-Ansicht wird innerhalb von Transaktionen auch auf Lesevorgänge nach Schreibvorgängen ausgedehnt. Im Gegensatz zu den meisten Datenbanken werden bei Abfragen und Lookups in einer Transaktion im Datastore-Modus nicht die Ergebnisse früherer Schreibvorgänge in dieser Transaktion angezeigt. Wenn eine Entität innerhalb einer Transaktion geändert oder gelöscht wird, gibt eine Abfrage oder ein Lookup die ursprüngliche Version der Entität vom Beginn der Transaktion zurück, bzw. nichts, wenn die Entität zu dem Zeitpunkt nicht vorhanden war.
Außerhalb von Transaktionen haben Abfragen und Lookups auch eine serialisierbare Isolation.
Gleichzeitigkeitsmodi
Firestore im Datastore-Modus unterstützt drei Parallelitätsmodi. Der Parallelitätsmodus ist eine Datenbankeinstellung, die festlegt, wie gleichzeitige Transaktionen interagieren. Sie können einen der folgenden Parallelitätsmodi auswählen:
Pessimistisch
Bei Lese- und Schreibtransaktionen werden Leser- und Autorsperren verwendet, um die Isolation und Serialisierbarkeit zu erzwingen. Wenn zwei oder mehr gleichzeitige Lese-Schreibtransaktionen dieselben Daten lesen oder schreiben, kann die durch eine Transaktion gehaltene Sperre die anderen Transaktionen verzögern. Wenn für Ihre Transaktion keine Schreibvorgänge erforderlich sind, können Sie durch Verwendung einer schreibgeschützten Transaktion die Leistung verbessern und Konflikte mit anderen Transaktionen vermeiden. Für schreibgeschützte Transaktionen sind keine Sperren erforderlich.
In Firestore im Datastore-Modus wird standardmäßig der pessimistische Gleichzeitigkeitsmodus verwendet.
Optimistisch
Wenn zwei oder mehr gleichzeitige Lese-Schreibtransaktionen dieselben Daten lesen oder schreiben, ist nur die erste Transaktion, die ihre Änderungen mit Commit speichert, erfolgreich. Andere Transaktionen, die Schreibvorgänge ausführen, schlagen beim Commit fehl.
Optimistisch mit Entitätsgruppen
Verwenden Sie diesen Parallelitätsmodus nur, wenn Ihre App von der Transaktionssemantik für Entitätengruppen des bisherigen Cloud Datastore abhängt. Dieser Parallelitätsmodus schränkt Transaktionen zusätzlich ein:
- Transaktionen sind auf 25 Entitätengruppen beschränkt.
- Schreibvorgänge in eine Entitätengruppe sind auf einen Vorgang pro Sekunde beschränkt.
- Abfragen in Transaktionen müssen Ancestor-Abfragen sein.
Wenn Sie die Einschränkungen für den
OPTIMISTIC_WITH_ENTITY_GROUPS
-Abfrage-, Transaktions- und Schreibdurchsatz aufheben möchten, ändern Sie den Parallelitätsmodus Ihres Projekts in „Optimistisch“. So prüfen Sie, ob diese Änderung mit Ihrem Projekt kompatibel ist:Erstellen Sie ein Testprojekt in Firestore im Datastore-Modus.
Ändern Sie den Parallelitätsmodus des Testprojekts in
OPTIMISTIC
. Senden Sie eine HTTP-PATCH-Anfrage, wie unten gezeigt.Führen Sie Tests für das Testprojekt durch, um sicherzustellen, dass Ihre Arbeitslast ohne Entitätsgruppen wie erwartet funktioniert.
Ändern Sie den Parallelisierungsmodus Ihres Hauptprojekts von
OPTIMISTIC_WITH_ENTITY_GROUPS
zuOPTIMISTIC
.
Nebenläufigkeitsmodus ansehen
Verwenden Sie die Firestore-REST-Ressource projects.databases, um den Gleichzeitigkeitsmodus Ihrer Datenbank aufzurufen:
curl -X GET -H "Authorization: Bearer "$(gcloud auth print-access-token) \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases"
Modus für die Nebenläufigkeit ändern
Wenn Sie den Gleichzeitigkeitsmodus Ihrer Datenbank ändern möchten, senden Sie eine PATCH
-Anfrage an die Firestore-REST-Ressource projects.databases:
curl --request PATCH \
--header "Authorization: Bearer "$(gcloud auth print-access-token) \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"concurrencyMode":"CONCURRENCY_MODE"}' \
"https://firestore.googleapis.com/v1/projects/PROJECT_ID/databases/(default)?updateMask=concurrencyMode"
Dabei gilt:
- CONCURRENCY_MODE ist
PESSIMISTIC
,OPTIMISTIC
oderOPTIMISTIC_WITH_ENTITY_GROUPS
. - PROJECT_ID ist die ID des Google Cloud-Projekts.
Anwendungsfälle für Transaktionen
Eine Verwendung von Transaktionen besteht in der Aktualisierung einer Entität mit einem neuen Attributwert bezogen auf den aktuellen Wert. Im transferFunds
-Beispiel oben wird dies für zwei Entitäten durchgeführt, indem Geldbeträge von einem Konto abgezogen und auf ein anderes überwiesen werden.
Die Datastore API wiederholt Transaktionen nicht automatisch. Sie können jedoch Ihre eigene Logik zur Wiederholung dieser Transaktionen hinzufügen, beispielsweise um Konflikte zu lösen, wenn eine andere Anfrage dieselbe Entität gleichzeitig aktualisiert.
C#
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore C# API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Go
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Go API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Java
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Java API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Node.js
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Node.js API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
PHP
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore PHP API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Python
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Python API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Ruby
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Ruby API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Dies erfordert eine Transaktion, weil der Wert von balance
in einer Entität von einem anderen Nutzer aktualisiert werden kann, nachdem dieser Code das Objekt abgerufen, doch bevor er das geänderte Objekt gespeichert hat. Ohne eine Transaktion verwendet die Anfrage des Nutzers den Wert von balance
vor der Aktualisierung durch den anderen Nutzer und beim Speichern wird der neue Wert überschrieben. Mit einer Transaktion wird die Anwendung über die Aktualisierung durch den anderen Nutzer informiert.
Transaktionen werden auch häufig verwendet, um eine Entität mit einem benannten Schlüssel abzurufen oder die Entität zu erstellen, wenn sie noch nicht vorhanden ist (dieses Beispiel baut auf dem TaskList-Beispiel in Entität erstellen auf):
C#
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore C# API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Go
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Go API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Java
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Java API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Node.js
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Node.js API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
PHP
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore PHP API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Python
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Python API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Ruby
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Ruby API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Wie im vorherigen Fall ist eine Transaktion erforderlich, um den Fall zu behandeln, dass ein anderer Nutzer gerade versucht, eine Entität mit derselben Zeichenfolge-ID zu erstellen oder zu aktualisieren. Wenn eine Entität nicht existiert und zwei Nutzer gleichzeitig versuchen sie zu erstellen, dann überschreibt ohne Verwendung einer Transaktion der zweite Versuch den ersten, ohne dies zu bemerken.
Wenn eine Transaktion fehlschlägt, können Sie veranlassen, dass die Anwendung die Transaktion so lange wiederholt, bis sie erfolgreich abgeschlossen wurde. Sie können aber auch die Nutzer den Fehler behandeln lassen, indem Sie ihn an die Benutzeroberfläche Ihrer Anwendung weiterleiten. Sie müssen keine Wiederholungsschleife für jede Transaktion erstellen.
Schreibgeschützte Transaktionen
Schließlich können Sie Transaktionen verwenden, um konsistente Snapshots der Datenbank zu lesen. Dies kann nützlich sein, wenn mehrere Lesevorgänge erforderlich sind, um eine Seite anzuzeigen oder Daten zu exportieren, die konsistent sein müssen. Sie können für diese Fälle eine schreibgeschützte Transaktion erstellen.
Schreibgeschützte Transaktionen können Entitäten nicht ändern, verursachen aber auch keine Konflikte mit anderen Transaktionen und müssen nicht wiederholt werden. Wenn Sie in einer regulären Lese-Schreib-Transaktion nur Lesevorgänge durchführen, kann dies Konflikte mit einer anderen Transaktion verursachen, die dieselben Daten ändert.
C#
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore C# API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Go
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Go API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Java
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Java API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Node.js
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Node.js API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
PHP
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore PHP API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Python
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Python API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.
Ruby
Informationen zum Installieren und Verwenden der Clientbibliothek für Cloud Datastore finden Sie hier. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Datastore Ruby API.
Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Datastore zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.