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)
Выход:
[]
Учитывая, что переводы предназначены в первую очередь для работы с предком запросов (флаг кросс-группа существует даже просто обойти это требование), почему строгая согласованность утрачиваются внутри транзакции?
Как обычно, я читал документы Google несколько раз, но, похоже, пропустил ключевую информацию, которую я искал. Я действительно думаю, что было бы полезно, чтобы в документах по запросам предков упоминалась изоляция транзакций, чтобы предотвратить путаницу/разочарование, которое я испытал. Спасибо, что указал мне в правильном направлении! – redhotvengeance