我的代码得到了一些奇怪的结果。我第一次运行代码时,只有来自期货的异步函数被保存到数据存储区,但没有任何事务是。另一方面,跟踪显示交易已提交。当我运行期货为空的相同代码时,交易将存储在数据存储区中。我在这里做错了什么?
伪代码
def check_users():
def callback(user,account):
return ndb.put_multi_async([user,account])
transactions = []
futures = []
users = Users.query().fetch(100)
for user in users:
if user.active:
account = Account.query(parent=user.key).order(-Account.date).get()
account.active = True
user.has_account = True
transactions.append(ndb.transanction_async(lambda:callback(user,account),xg=true))
continue
user.count += 1
futures.append(user.put_async())
for transanction in transactions:
futures = trasanction.get_result()
for future in futures:
future.check_result()
for future in futures:
future.check_result()
已更新 第二个Does ndb.toplevel break transactions?,事务创建一个与另一个异步方法冲突的新上下文。我想知道我的代码是否发生了同样的问题。这就是问题的答案:
我发现问题是两者都创造了新的背景。 transactional创建一个上下文,并确保在其中发生的所有写入都是非冲突的。 toplevel创建一个上下文,并确保解决在其中创建的所有未来。