我正在使用 Google App Engine SDK 1.7.3 和 NDB 来访问数据存储区。
我应该如何从事务性小任务中运行非事务性小任务?
以下是首先想到的:
@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 的创建者建议不要将装饰器(例如 is done 与@ndb.tasklet
and )@ndb.transactional
结合使用,而是使用该ndb.transaction_async(callback, **ctx_options)
函数。有关执行此操作的问题,请参见此处。因此,我担心将@ndb.tasklet
和@ndb.non_transactional
装饰器结合起来也可能很脆弱并且容易出现意外行为。
请注意,ndb.transaction_async(callback, **ctx_options)
在NDB API中提供但不是ndb.non_transaction_async(callback, **ctx_options)
.
我想知道是否ndb.non_transaction_async(callback, **ctx_options)
需要在 NDB API 中公开一个函数来帮助我稳健地完成我想做的事情?