几年来我一直在使用类似于我在下面复制的代码片段。
基本的想法是Person
可以结婚,当他们结婚时,我创建一个"婚姻"实体。 一个人只能结婚一次,所以我有一个布尔值来指示这个人是否结婚(Person.married
(。 当一个人结婚时,我会更新Person
并在如下所示的事务中创建Marriage
实体:
@ndb.transactional(xg=True)
def update_person(pid):
person = Person.get_by_id(pid)
if person.married:
raise RuntimeError("This person is already married.")
else:
marriage = Marriage(person=person)
person.married = True
ndb.put_multi([person, marriage])
这是我的代码中唯一创建Marriage
实体的地方。对Person
实体的所有更新都在事务中完成。
不知何故,我现在有一个结过两次婚的人实体(两个婚姻实体的一部分(! 这是多年来第一次发生这种情况,但令人不安的是,这种情况可能发生。
我的代码中是否有错误? 如果没有,知道这是怎么发生的吗?
两段婚姻是同时创造的吗?
我遇到了奇怪的过时缓存问题,也许可以进行以下更改:use_cache=False, use_memcache=False
所以这个:
person = Person.get_by_id(pid, use_cache=False, use_memcache=False)
https://cloud.google.com/appengine/docs/standard/python/ndb/cache
另外,您的所有编辑函数Person
都发生在事务中吗?就像代码中的其他地方一样,您是否有这样的函数:
def update_person_email(pid, email):
person = Person.get_by_id(pid)
person.email = email
person.put()
如果是这样,那么事件的顺序可能是:
-
update_person_email
获得Person
A - 您的
update_person
获得并放入 APerson
-
update_person_email
将Person
A 放(覆盖married
再次为假(