首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NDB事务中的Bug?

NDB事务中的Bug?
EN

Stack Overflow用户
提问于 2019-04-17 02:04:51
回答 1查看 54关注 0票数 2

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

基本的想法是,一个Person可以结婚,当他们结婚时,我创建了一个“婚姻”实体。一个人只能结一次婚,所以我有一个布尔值来表示这个人是否结婚(Person.married)。当一个人结婚时,我更新Person并在事务中创建Marriage实体,如下所示:

代码语言:javascript
复制
@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?如果没有,你知道这是怎么发生的吗?

EN

回答 1

Stack Overflow用户

发布于 2019-04-17 03:43:41

这两个婚姻是同时产生的吗?

我遇到了奇怪的陈旧缓存问题,也许可以进行以下更改:use_cache=False, use_memcache=False

所以这就是:

代码语言:javascript
复制
person = Person.get_by_id(pid, use_cache=False, use_memcache=False)

https://cloud.google.com/appengine/docs/standard/python/ndb/cache

另外,您编辑Person的所有函数都是在事务中执行的吗?就像你的代码中的其他地方一样,你有这样一个函数:

代码语言:javascript
复制
def update_person_email(pid, email):
    person = Person.get_by_id(pid)
    person.email = email
    person.put()

如果是这样,那么事件的顺序可能是:

  • update_person_email gets Person A
  • your update_person gets Person puts A
  • update_person_email puts Person Person A (overwriting married to be false and )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55714168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档