Does ndb.toplevel break transactions?

一曲冷凌霜 提交于 2019-12-30 03:20:49

问题


The following code works as expected and does not trigger the assertion:

@ndb.transactional
@ndb.tasklet
def Foo():
  assert ndb.in_transaction()

The following code breaks, triggering the assertion:

@ndb.transactional
@ndb.toplevel
def Foo():
  assert ndb.in_transaction()

I tried replacing the decorator with an ndb.transaction call or an ndb.transaction_async call, but neither worked.

Is there a bug with ndb.toplevel and transactions?


回答1:


I discovered that the problems is that both create new contexts. transactional creates a context and ensures that all writes that happen inside of it are non-conflicting. toplevel creates a context and ensures that all futures that are created inside of it are resolved.

As a result, toplevel is clobbering transaction's context. The two just can't be combined in their current implementation.



来源:https://stackoverflow.com/questions/21506231/does-ndb-toplevel-break-transactions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!