Python 事务性tasklet中的非事务性操作

Python 事务性tasklet中的非事务性操作,python,google-app-engine,app-engine-ndb,Python,Google App Engine,App Engine Ndb,我正在使用Google App Engine SDK 1.7.3和NDB访问数据存储 如何从事务性tasklet中运行非事务性tasklet 首先想到的是: @ndb.tasklet @ndb.non_transactional def non_txn_method(): ''' Run some code that does not require a transaction ''' result = calculate_result() raise ndb.Retur

我正在使用Google App Engine SDK 1.7.3和NDB访问数据存储

如何从事务性tasklet中运行非事务性tasklet

首先想到的是:

@ndb.tasklet
@ndb.non_transactional
def non_txn_method():
    ''' Run some code that does not require a transaction '''
    result = calculate_result()
    raise ndb.Return(result)

@ndb.tasklet
@ndb.transactional
def txn_method():
    ''' Run some code that requires a transaction '''
    non_txn_result = yield non_txn_method()
但是,NDB的创建者不能将装饰器组合在一起,例如使用
@NDB.tasklet
@NDB.transactional
完成的装饰器,而是使用
NDB.transaction\u async(回调,**ctx\u选项)
函数。有关执行此操作的问题,请参阅。因此,我担心组合
@ndb.tasklet
@ndb.non_transactional
装饰程序也可能很脆弱,容易出现意外行为

请注意,
ndb.non\u transaction\u async(回调,**ctx\u选项)
中提供了
ndb.non\u transaction\u async(回调,**ctx\u选项)


我想知道是否需要在ndb API中公开一个
ndb.non_transaction\u async(回调,**ctx\u选项)
函数,以帮助我稳健地完成我想做的事情?

我建议您在ndb bug跟踪器中为建议的新功能提交一个bug:

请注意,以下装饰订单按预期工作(至少从1.7.3开始):


因此需要使用旧的db解决方案。

谢谢@guido,我看到您不再使用它了。
@ndb.non_transactional
@ndb.tasklet
def non_txn_method():
  # If calling old db, need this too:
  datastore._SetConnection(None)
  # ...