NDB交易中的错误



几年来我一直在使用类似于我在下面复制的代码片段。

基本的想法是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获得并放入 A Person
  • update_person_emailPerson A 放(覆盖 married 再次为假(

相关内容

最新更新