ndb.toplevel会破坏交易吗?

Sam*_*ing 7 python google-app-engine asynchronous transactions app-engine-ndb

以下代码按预期工作,不会触发断言:

@ndb.transactional
@ndb.tasklet
def Foo():
  assert ndb.in_transaction()
Run Code Online (Sandbox Code Playgroud)

以下代码中断,触发断言:

@ndb.transactional
@ndb.toplevel
def Foo():
  assert ndb.in_transaction()
Run Code Online (Sandbox Code Playgroud)

我尝试用ndb.transaction调用或ndb.transaction_async调用替换装饰器,但都没有工作.

ndb.toplevel和事务有错误吗?

Sam*_*ing 6

我发现问题是两者都创造了新的背景.transactional创建一个上下文,并确保在其中发生的所有写入都是非冲突的.toplevel创建一个上下文,并确保解决在其中创建的所有期货.

因此,toplevel是破坏事务的上下文.这两者在当前的实现中无法合并.