【发布时间】:2017-06-26 00:17:23
【问题描述】:
我的理解是ndb.transactional 用于确保函数处理最新数据。我在本地 Google App Engine 开发服务器的交互式控制台中测试了以下代码:
from google.appengine.ext import ndb
class UserModel(ndb.Model):
level = ndb.IntegerProperty(default=0)
@ndb.transactional(retries=0)
def inc_user_lvl(user_key, recurse=True):
user = user_key.get()
print(user.level)
user.level += 1
if recurse:
inc_user_lvl(user_key, recurse=False)
user.put()
user_key = UserModel().put()
inc_user_lvl(user_key)
user = user_key.get()
print(user.level)
尝试重试的次数有限制(默认为 3);如果事务仍然不成功,NDB 会引发
TransactionFailedError。
在这种情况下,重试次数为 0,因此我预计用户的级别会增加到 1 并提高 TransactionFailedError。
相反,函数调用都成功了,对inc_user_lvl 的第二次调用在级别 1 的用户上运行(在第一次调用放置实体之前)。两次通话结束后,用户的等级为 2。为什么会这样?
【问题讨论】:
标签: python google-app-engine transactions app-engine-ndb