在我看来,方法中的事务不包含作为方法参数的变量。因为在我的应用程序中,我得到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
也会递增。
这是对的吗?
答案 0 :(得分:3)
是。由于实体get()在事务之外,因此无法回滚(事务不会知道实体的先前值。此外,如果此事务实际上是为了增加实体。 x乘以1,它将无法提供事务一致性。
想象一下entity.x = 1,此事务可能会启动,并且对同一请求运行的第二个请求可能同时运行。由于两者都在事务之外,它们都读取1,然后它们都将x增加到2,并且它将保存为2,即使它增加了两次并且应该是3由于get()在事务之外,因此不受保护。