1

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.

Antwort

1

Transaktionen über mehrere Entitätsgruppen ist in der Tat erlaubt (mit einer Obergrenze von 25 Entitätsgruppen per documentation)

Wenn Sie innerhalb einer Transaktion Abfragen verwenden möchten,

Hinweis: dieser Schlüsselsatz in der Text, den Sie zitiert haben. Es besagt, dass alle Abfragen, die Sie innerhalb einer Transaktion ausgeben möchten, Vorfahren-Abfragen sein müssen. Dies liegt daran, dass Abfragen ohne Vorgänger möglicherweise konsistent sind, sodass es für die Transaktions-Engine unmöglich ist, über Statusänderungen nachzudenken und daher nicht zu wissen, wann die Transaktion fehlschlagen oder erfolgreich sein soll. Es ist nicht, dass Sie Transaktionen über Entitätsgruppen nicht tun können.

Es gibt kein übergeordnetes Element an und verwendet eine einzelne Root-Entität innerhalb einer -Transaktion, oder?

Ich denke, das ist die andere Quelle der Verwirrung. Nur untergeordnete Entitäten haben übergeordnete Elemente, die angeben, in welcher Entitätsgruppe sie sich befinden. Wenn kein übergeordnetes Element angegeben ist, lautet die fragliche Entität eine Stammentität (ihr übergeordnetes Element ist root). Eine andere Möglichkeit, dies zu sagen, ist, dass jede Wurzel-Entität ihre eigene Entitätsgruppe ist.

+0

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. –

+1

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. –

+0

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 :) –

0

Technisch bildet die Aufgabenentität in Ihrer Beschreibung eine Entitätsgruppe, obwohl keine untergeordneten Entitäten vorhanden sind. Die maximal zulässige Anzahl an Entitätsgruppen beträgt 25. Wenn Sie also versuchen, mehr als 25 Entitäten der obersten Ebene mit diesem Muster zu erstellen, schlagen Ihre Abfragen fehl.

Die Art, wie ich Leistungseinbußen vermeide, ist die Verwendung mehrerer Entitätsgruppen. Ich strukturiere meinen Datenspeicher so, dass ich mehrere Root-Entitäten habe und versuche, mehrere Transaktionen innerhalb einer Entitätsgruppe zu beschränken.

+0

Ich habe Hintergrundarbeiter und möchte sicherstellen, dass, während ein Arbeiter einen Auftrag bearbeitet, keine anderen den gleichen Auftrag redundant verarbeiten. Wenn also Job-Informationen im DataStore gespeichert sind, möchte ich die Job-Entität nur während eines Prozesses sperren. Ich denke, ich kann Transaktion für diesen Zweck verwenden (wenn alle Prozesse versuchen, einige Sperre Eigenschaft in Transaktion zu aktualisieren, dann wird nur die erste erfolgreich sein). Aber ich dachte, ich kann jeden Job einfach als root-Entity speichern, aber nachdem ich das Dokument gelesen habe, mache ich mir Sorgen, ob ich strukturieren muss, so dass jede Entität ein Elternteil hat (was vernünftig verteilt ist). –

Verwandte Themen