5

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?

Odpowiedz

3

Dokumentów Google here nie uwzględniają ostatni przykład:

W przeciwieństwie do większości baz danych, kwerendy i dostaje wewnątrz transakcji Chmura Datastore nie zobaczyć wyniki poprzednich zapisów wewnątrz tej transakcji . W szczególności, jeśli jednostka jest modyfikowana lub usuwana w ramach transakcji, zapytania lub polecenia zwraca pierwotną wersję jednostki na początku transakcji lub nie ma nic, jeśli jednostka nie istnieje.

Nie mogę tego wyjaśnić lepiej niż dokumenty Google, ale jest to zamierzone zachowanie w przypadku transakcji opartych na tym, w jaki sposób Google wdraża izolację transakcji.

+0

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

Powiązane problemy