Ich möchte mein Verständnis der möglichen Konsistenz im Google-Datenspeicher bestätigen. Nehmen wir an, ich habe ein Unternehmen wie folgt definiert (unter Verwendung von NDB):Google Datastore-Abfragen und eventuelle Konsistenz
class Record(ndb.Model):
name = ndb.StringProperty()
content = ndb.BlobProperty()
Ich glaube, ich verstehe Szenarien 1, aber ich habe Zweifel an den Szenarien 2 und 3, so würden einige Ratschläge sehr geschätzt werden.
Szenario 1: Ich füge einen neuen Datensatz mit dem Namen "Luca" und einem bestimmten Inhalt. Dann Abfrage ich den Datenspeicher:
qry = Record.query(name=="Luca")
for r in qry.iter():
logger.info("I got this content: %r" % r.content)
Ich verstehe, dass aufgrund Eventual Consistency, der gerade eingefügten Datensatz nicht Teil der Ergebnismenge sein könnte. Ich weiß über die Verwendung von Vorfahren-Abfragen, um dies bei Bedarf zu umgehen.
Szenario 2: Ich lese einen bestehenden Record mit dem Namen "Luca", aktualisiere den Inhalt und schreibe ihn zurück. Zum Beispiel unter der Annahme, ich den Schlüssel „k“ dieses Datensatzes haben:
r = k.get()
r.content = "new content"
r.put()
Dann laufe ich die gleiche Abfrage wie in Szenario 1. Wenn ich die Ergebnisse erhalten, gehen davon aus, dass der Datensatz Teil der Ergebnismenge (Zum Beispiel, weil der Index bereits den Datensatz mit dem Namen "Luca" und dem Schlüssel k enthielt). Habe ich dann garantiert, dass der Feldinhalt seinen neuen Wert "Neuer Inhalt" haben wird? Mit anderen Worten, wenn ich einen Datensatz aktualisiere und seine Schlüssel und indizierten Felder allein lasse, kann ich dann garantiert den neuesten Wert lesen?
Szenario 3: I Szenario ähnlich tun 2, wieder, wo k ist der Schlüssel eines Datensatzes mit dem Namen "Luca":
r = k.get()
r.content = "new content"
r.put()
aber dann betreibe ich eine modifizierte Version der Abfrage:
In diesem Fall sagt mir die Logik, dass ich den neuesten Wert des Inhalts bekommen sollte, weil das Lesen nach Schlüssel eine starke Konsistenz garantiert. Ich würde mich über eine Bestätigung freuen.
Aha, danke, sehr interessant. Es gibt also einen Unterschied zwischen der normalen Ausführung einer Abfrage und dem Ausführen von keys_only = True und dem anschließenden Lesen des Schlüssels. – Luca
ja, über den Schlüssel gehen sollte konsistent sein ... aber ich hatte Probleme mit dem Rollback von Transaktionen ... (wenn etwas in der Commit-Anweisung fehlschlägt) es funktioniert nicht immer (mit JDO - Java) ... ich denke Ich tue es nicht falsch .. aber denke mit nativen Google Code sollte es funktionieren! – headgrowe