几年来,我一直在使用与下面复制的代码片段类似的代码片段。
基本的想法是,一个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实体的所有更新都在事务中完成。
不知何故,我现在有了一个结过两次婚的Person实体(两个婚姻实体的一部分)!这是多年来的第一次,但令人不安的是,这种情况可能会发生。
我的代码中有没有bug?如果没有,你知道这是怎么发生的吗?
发布于 2019-04-17 03:43:41
这两个婚姻是同时产生的吗?
我遇到了奇怪的陈旧缓存问题,也许可以进行以下更改: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 gets Person Aupdate_person gets Person puts Aupdate_person_email puts Person Person A (overwriting married to be false and )https://stackoverflow.com/questions/55714168
复制相似问题