Ich bin neu in Google CloudDatastore und lese ein Dokument.
(Anmerkung:. Wir planen nicht Google App Engine, nur Datastor nur verwenden)Google Cloud Datastore - Ist es möglich, eine Transaktion für eine einzelne Root-Entität zu verwenden?
Nach den document unterstützen Datastor Transaktion aber
If you want to use queries within a transaction,
your data must be organized into entity groups in such a way
that you can specify ancestor filters that will match the right data.
Also dachte ich, so lange ich verwenden mag Ich bin gezwungen, einen Elternschlüssel zu erstellen und ihn als Vorfahren zu definieren. Und alle Entitäten unter dem übergeordneten Element haben eine Einschränkung, dass Aktualisierung und Transaktion nur einmal pro Sekunde ausgeführt werden können.
Allerdings habe ich auch ein sehr einfaches Beispiel des Einsatzes siehe hier: https://cloud.google.com/datastore/docs/concepts/entities#datastore-insert-python
with client.transaction():
incomplete_key = client.key('Task')
task = datastore.Entity(key=incomplete_key)
task.update({
'category': 'Personal',
'done': False,
'priority': 4,
'description': 'Learn Cloud Datastore'
})
client.put(task)
Sie stellen keine Eltern angeben und eine einzige Root-Entität innerhalb einer Transaktion verwenden, nicht wahr? Auch über Beispiele in Transaction page spezifiziert nur der für "Nur-Lese-Transaktion" explizit einen Elternteil. Verwerfen andere einfach einen Elternteil, solange er existiert?
Ich frage mich, ich Transaktion ohne eine Entität-Gruppe (= ohne große Leistung beeinträchtigt) verwenden kann, wenn ich einen Schlüssel einer Root-Entität angeben kann, aber es gibt keine solche Beschreibung in dem Dokument ...
Ich würde mich freuen, wenn jemand das Verhalten klären kann. Vielen Dank.
Also ist es legitim, so zu tun? --- (0) suchen Sie einige root-Entity nach ihrem Schlüssel und überprüfen Sie ihre 'Version' Eigenschaft (1) starten Sie eine Transaktion (2) erneut die Entität nachschlagen und überprüfen Sie die 'Version'. (3-a) Wenn 'Version' gleich (0) ist, den Wert aktualisieren und fortfahren (3-b) Anderenfalls hat ein anderer Prozess die Entität berührt, also überspringe den Job. (4) Commit der Transaktion --- Grundsätzlich möchte ich eine Art optimistische Sperre für eine einzelne Entität implementieren, um eine Aufgabe gleichzeitig zu verarbeiten, und frage mich in diesem Fall, ob ich noch eine Art Vorfahre für jede Entität vorbereiten muss um die obige Transaktion durchzuführen. –
Absolut gültig. Als ein FYI verwenden unsere Transaktionen selbst optimistisches Sperren. Sie müssen sich nicht um die ganze Vorfahrsache kümmern, wenn Sie nur Lese- und Schreibvorgänge durchführen. Es kommt nur in Betracht, wenn Sie eine SELECT/RunQuery machen. –
Okay, danke für die Information! Es klingt, dass wir unseren bestehenden MongoDB-Stack in den vollständig verwalteten DataStore migrieren können. Ich schätze deine schnelle Antwort :) –