5

Ich weiß, dass die Art und Weise, DB-Transaktionen auf der App-Engine zu handhaben, unterschiedliche Entitäten zu Parent (Entity Group) und zu verwenden.In der Google App-Engine, wie implementiere ich Datenbank-Transaktionen?

Allerdings angenommen, dass ich bin nicht in der Lage, zwei Einheiten das gleiche Elternteil zu geben. Wie stelle ich sicher, dass meine DB-Aktualisierungen in einer Transaktion stattfinden?

Gibt es eine technische Lösung? Wenn nicht, gibt es ein Muster, das ich anwenden kann?

Hinweis: Ich verwende Python.

Antwort

5

Solange die Entitäten zu derselben Gruppe gehören, ist dies kein Problem. Von den docs:

Alle Datenspeichervorgänge in einer Transaktion auf Entitäten in derselben Einheit Gruppe arbeiten müssen. Diese umfasst die Abfrage von Entitäten nach Vorfahren, Abrufen von Entitäten nach Schlüssel, Aktualisieren von Entitäten und Löschen von Entitäten. Beachten Sie, dass jede Root-Entität zu einer separaten Entitätsgruppe gehört, sodass eine einzelne Transaktion nicht erstellt werden kann oder mit mehr als einer Root-Entität arbeiten kann. Eine Erläuterung der Entitätsgruppen finden Sie unter unter Schlüssel und Entitätsgruppen.

Es gibt auch einen schönen Artikel über Transaction Isolation in App Engine.

BEARBEITEN: Wenn Sie Entitäten mit unterschiedlichen Eltern in derselben Transaktion aktualisieren müssen, müssen Sie eine Möglichkeit implementieren, die von Ihnen vorgenommenen Änderungen zu serialisieren und bei Auftreten einer Ausnahme manuell Rollback durchzuführen.

+0

Aber wenn Sie folgen Sie den "Keys und Entitätsgruppen" -Link http://code.google.com/appengine/docs/ python/datastore/keysdentitygroups.html # Entity_Groups_Ancestors_and_Paths, die einzige Methode, die für das Einfügen von zwei Entitäten in derselben Entity Group aufgelistet wird, ist sicherzustellen, dass sie einen Vorfahren teilen –

+0

Entschuldigung, technisch gesehen meine ich Gruppen, nicht Eltern. Aber laut dem Buch, das ich lese, scheint es, dass die einzige Möglichkeit, Gruppen in Python zuzuweisen, die eines gemeinsamen Vorfahren/Elternteils ist. – willem

+0

@James @ Willem Sie haben beide Recht. Entitäten werden nur dann als Gruppe betrachtet, wenn sie denselben Stammknoten verwenden. Ich habe meine Antwort bearbeiten. – jbochi

2

Transaktionen im AppEngine-Datenspeicher verhalten sich anders als die Transaktionen, die Sie möglicherweise in einer SQL-Datenbank verwenden. Zum einen sperrt die Transaktion die Entitäten, auf denen sie operiert, nicht.

Der Translation Isolation in App Engine Artikel erklärt das ausführlicher.

Aus diesem Grund werden Sie über Transaktionen möglicherweise anders denken - Sie werden wahrscheinlich feststellen, dass es in den meisten Fällen, in denen Sie eine Transaktion verwenden möchten, entweder unnötig ist - oder es nicht erreichen würde wollen. Weitere Informationen zu Entitätsgruppen und zum Datenspeichermodell finden Sie unter How Entities and Indexes are Stored.

Handling Datastore Errors spricht über Dinge, die dazu führen könnten, dass eine Transaktion nicht ausgeführt wird und wie mit den Problemen umzugehen ist.

2

Eine Möglichkeit besteht darin, Ihre eigene Transaktionsverarbeitung wie erwähnt zu implementieren. Wenn Sie darüber nachdenken, wäre es Ihre Zeit wert, die früheren Arbeiten zu diesem Problem zu untersuchen.

http://danielwilkerson.com/dist-trans-gae.html

Dan Wilkerson gab auch einen Vortrag über sie bei Google IO. Sie sollten in der Lage sein, ein Video des Vortrags zu finden.

+0

Sehr nützlich, danke Kris. – willem

3

Wenn Sie Transaktionen mit mehreren Entitätengruppen durchführen möchten, müssen Sie sie selbst implementieren oder warten, bis eine Bibliothek diese Aufgaben erledigt. Ich schrieb vor einer Weile an article darüber, wie man transaktionsübergreifende Gruppentransaktionen im Fall der "Banküberweisung" implementiert; Es kann sich auch auf Ihren Anwendungsfall beziehen.

+0

+1 sehr schöner Artikel! Danke! – jbochi