NDB中的事务不包括方法的参数

时间:2013-08-31 03:51:20

标签: google-app-engine google-cloud-datastore app-engine-ndb

在我看来,方法中的事务不包含作为方法参数的变量。因为在我的应用程序中,我得到entity递增而不更改其他模型。

@ndb.transactional(xg=true)
def method(entity):
    # `entity` is a datastore entity

    # Transaction works here
    Model.foo()
    # ...here too
    Model.bar()

    # But not here! Always incremented.
    entity.x += 1
    entity.put()

在上面的示例中,即使事务失败,实体的属性x也会递增。

这是对的吗?

1 个答案:

答案 0 :(得分:3)

是。由于实体get()在事务之外,因此无法回滚(事务不会知道实体的先前值。此外,如果此事务实际上是为了增加实体。 x乘以1,它将无法提供事务一致性。

想象一下entity.x = 1,此事务可能会启动,并且对同一请求运行的第二个请求可能同时运行。由于两者都在事务之外,它们都读取1,然后它们都将x增加到2,并且它将保存为2,即使它增加了两次并且应该是3由于get()在事务之外,因此不受保护。