5

Google Cloud Datastore - это нереляционная база данных и построена на основе концепции eventual consistency. Он также обеспечивает средства для обеспечения сильной консистенции через ancestor queries and entity groups. Тем не менее, я не получаю сильную согласованность при использовании запросов предков в пределах transaction.Сильная последовательность в транзакциях в Google Cloud Datastore

Рассмотрим это:

class Child(ndb.Model): 

    @classmethod 
    def create(cls): 
     child = cls() 
     child.put() 
     print Child.query().fetch() 

Child.create() 

Поскольку это не использовать группу объектов, она работает с возможной последовательностью. Как и следовало ожидать, мы получим:

[] 

Давайте попробуем с помощью групп сущностей и предок запрос:

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) 

Здесь мы получаем сильную консистенцию, поэтому выход:

[Child(key=Key('Parent', <id>, 'Child', <id>))] 

Однако , когда мы проводим транзакцию в смесь:

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) 

Выход:

[] 

Учитывая, что переводы предназначены в первую очередь для работы с предком запросов (флаг кросс-группа существует даже просто обойти это требование), почему строгая согласованность утрачиваются внутри транзакции?

ответ

3

документы Google, here сделать адрес вашего последнего примера:

В отличие от большинства баз данных, запросов и получает внутри транзакции Облако Datastore не видят результаты предыдущих записей внутри этой сделки. В частности, если объект изменен или удален в пределах транзакции, запрос или get возвращает исходную версию объекта на начало транзакции или ничего, если объект не существовал.

Я не могу объяснить это лучше, чем документы Google, но это предназначенное поведение для транзакций на основе того, как Google реализует изоляцию транзакций.

+0

Как обычно, я читал документы Google несколько раз, но, похоже, пропустил ключевую информацию, которую я искал. Я действительно думаю, что было бы полезно, чтобы в документах по запросам предков упоминалась изоляция транзакций, чтобы предотвратить путаницу/разочарование, которое я испытал. Спасибо, что указал мне в правильном направлении! – redhotvengeance

 Смежные вопросы

  • Нет связанных вопросов^_^