Google Cloud Datastore jest nierelatywną bazą danych i opiera się na koncepcji eventual consistency. Dostarcza także środków do uzyskania silnej konsystencji poprzez ancestor queries and entity groups. Jednak nie uzyskuję silnej spójności podczas korzystania z zapytań o przodki w ramach transaction.Silna spójność transakcji w Google Cloud Datastore
Rozważ to:
class Child(ndb.Model):
@classmethod
def create(cls):
child = cls()
child.put()
print Child.query().fetch()
Child.create()
Ponieważ nie używać grupę podmiotu, działa z ewentualnym konsystencji. Zgodnie z oczekiwaniami, otrzymujemy:
[]
Spróbujmy go za pomocą grup jednostki i zapytania przodka:
class Parent(ndb.Model):
pass
class Child(ndb.Model):
@classmethod
def create(cls, parent):
child = cls(parent=parent)
child.put()
print Child.query(ancestor=parent).fetch()
parent = Parent().put()
Child.create(parent)
Tutaj otrzymujemy silne konsystencję, więc wyjście jest:
[Child(key=Key('Parent', <id>, 'Child', <id>))]
jednak , kiedy wyrzucamy transakcję do miksu:
class Parent(ndb.Model):
pass
class Child(ndb.Model):
@classmethod
@ndb.transactional
def create(cls, parent):
child = cls(parent=parent)
child.put()
print Child.query(ancestor=parent).fetch()
parent = Parent().put()
Child.create(parent)
Wyjście jest:
[]
Biorąc pod uwagę, że tłumaczenia mają przede wszystkim praca z zapytaniami przodków (flaga cross-grupa jeszcze istnieje tylko obejść tego wymogu), dlaczego jest silny konsystencja giną wewnątrz transakcji?
Jak zwykle, wielokrotnie czytałem dokumenty Google'a, ale wydawało mi się, że tęsknię za kluczowymi informacjami, których szukałem. Sądzę, że pomocne byłoby, gdyby dokumenty dotyczące zapytań dotyczących przodków wspomniały o izolacji transakcji, aby zapobiec dezorientacji/frustracji, której doznałem. Dzięki za wskazanie mi właściwego kierunku! – redhotvengeance