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

时间:2012-12-14 12:21:02

标签: 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.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)函数来帮助我稳健地完成我想要做的事情?

2 个答案:

答案 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