Die Hauptverwendung von Entitätsgruppen besteht darin, die Möglichkeit bereitzustellen, mehr als eine Entität in einer Transaktion zu aktualisieren.
Wenn Sie sie nicht verwenden mussten, zählen Sie Ihren Segen. Entweder haben Sie Ihre Datenmodelle so entworfen, dass keine zwei Entitäten jemals gleichzeitig aktualisiert werden müssen, um konsistent zu bleiben, sonst brauchen Sie sie, aber Sie haben Glück :)
Stellen Sie sich vor, dass ich habe einen Rechnungseinheitstyp und einen LineItem-Entitätstyp. Einer Rechnung können mehrere LineItems zugeordnet sein. Meine Rechnungseinheit hat ein Feld namens LastUpdated. Jedes Mal, wenn ein LineItem zu meiner Rechnung hinzugefügt wird, möchte ich das aktuelle Datum im Feld LastUpdated speichern.
Meine Update-Funktion wie diese (Pseudo-Code) aussehen könnte
invoice.lastUpdated = now()
lineitem = new lineitem()
invoice.put()
lineitem.put()
Was passiert, wenn die Rechnung put() erfolgreich ist und die lineitem put() fehlschlägt? Mein Rechnungsdatum zeigt an, dass etwas aktualisiert wurde, aber das eigentliche Update (das neue LineItem) wäre nicht vorhanden. Die Lösung besteht darin, beide puts() innerhalb einer Transaktion zu platzieren.
Eine alternative Lösung wäre, eine Abfrage zu verwenden, um das Datum des zuletzt eingefügten LineItem zu finden, anstatt diese Daten im Feld LastUpdated zu speichern. Das würde jedoch bedeuten, dass Sie sowohl die Rechnung als auch alle Zeilenelemente jedes Mal abholen müssen, wenn Sie wissen wollten, wann ein Zeilenelement zuletzt hinzugefügt wurde. Das kostet Sie wertvolle Datenspeicherkontingente.
EDIT ZU POSTER KOMMENTAR REAGIEREN
Ah. Ich glaube, ich verstehe deine Verwirrung. Die obigen Absätze zeigen, warum Transaktionen wichtig sind. Aber Sie sagen, Sie interessieren sich immer noch nicht für Entitätsgruppen, weil Sie nicht sehen, wie sie sich auf Transaktionen beziehen. Wenn Sie db.run-in-transaction verwenden, verwenden Sie Entitätsgruppen, vielleicht ohne es zu merken! Jede Transaktion umfasst eine einzige Entitätsgruppe und jede Transaktion kann nur Entitäten betreffen, die derselben Gruppe angehören. siehe here
„Alle Datenspeichervorgänge in einer Transaktion auf Entitäten in derselben Einheit Gruppe arbeiten müssen“.
Was machen Sie bei Ihren Transaktionen? Es gibt viele gute Gründe, Transaktionen mit nur einer Entität zu verwenden, die sich standardmäßig in einer eigenen Unternehmensgruppe befindet.Aber manchmal müssen Sie 2 oder mehr Entitäten synchron halten, wie in meinem obigen Beispiel. Wenn sich die Invoice- und die LineItem-Entitäten nicht in derselben Entitätsgruppe befinden, konnten Sie die Änderungen in einem db.run-in-transaction-Aufruf nicht umbrechen. Wenn Sie also mit 2 oder mehr Entitäten arbeiten möchten, müssen Sie zunächst sicherstellen, dass sie sich in derselben Gruppe befinden. Hoffnung, die es klarer macht, warum sie nützlich sind.
Ich habe db.run_in_transaction (siehe http://code.google.com/appengine/docs/python/datastore/functions.html) für Transaktionen verwendet (oder natürlich get_or_insert für diesen speziellen Fall, siehe auch http : //code.google.com/appengine/docs/python/datastore/transactions.html) - Was ist der Vorteil von Entitätsgruppen? –
autsch! mein erster Downvote. Der Vorteil von Entitätsgruppen gegenüber Transaktionen besteht darin, dass Transaktionen nicht außerhalb von Entitätsgruppen arbeiten. Wenn Sie Transaktionen verwendet haben, verwenden Sie Entitätsgruppen, wenn auch nur implizit. Jede Entität ist standardmäßig in einer Gruppe. Transaktionen sind in ihrem Umfang darauf beschränkt, jeweils eine Unternehmensgruppe zu beeinflussen. Ich habe meine Antwort mit einer längeren Erklärung bearbeitet. –
Warum wird dies abgelehnt? Es ist eine gute Antwort. –