我正在使用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 advises的创建者不会使用@ndb.tasklet
和@ndb.transactional
来组合装饰器,而是使用ndb.transaction_async(callback, **ctx_options)
函数。有关此问题,请参阅here。因此,我担心组合@ndb.tasklet
和@ndb.non_transactional
装饰器也可能很脆弱,容易出现意外行为。
请注意,NDB API中提供了ndb.transaction_async(callback, **ctx_options)
,但ndb.non_transaction_async(callback, **ctx_options)
未提供。{/ p>
我想知道是否需要在NDB API中公开ndb.non_transaction_async(callback, **ctx_options)
函数来帮助我稳健地完成我想要做的事情?
答案 0 :(得分:2)
请注意,以下装饰器顺序按预期工作(至少从1.7.3开始):
@ndb.non_transactional
@ndb.tasklet
def non_txn_method():
# If calling old db, need this too:
datastore._SetConnection(None)
# ...
由于此bug,需要旧的数据库解决方法。
答案 1 :(得分:0)
我建议您为NDB错误跟踪器中的建议新功能提交错误: http://code.google.com/p/appengine-ndb-experiment/issues/list