Does ndb.toplevel break transactions?
app-engine-ndb, asynchronous, google-app-engine, python, transactions
Solution
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.
Problem
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?