1

在我看来,方法中的事务不包括作为方法参数的变量。因为在我的应用程序中,我得到了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即使事务失败,实体的属性也会增加。

这是正确的吗?

4

1 回答 1

3

是的。由于实体 get() 在事务之外,因此没有可回滚的价值(事务不会知道实体的先前值。此外,如果此事务实际上是打算将 entity.x 加一,它会无法提供事务一致性。

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

于 2013-08-31T06:04:31.663 回答