1

我正在使用 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.taskletand )@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 中公开一个函数来帮助我稳健地完成我想做的事情?

4

2 回答 2

2

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

@ndb.non_transactional
@ndb.tasklet
def non_txn_method():
  # If calling old db, need this too:
  datastore._SetConnection(None)
  # ...

由于这个错误,需要旧的数据库解决方法。

于 2013-01-06T01:03:36.303 回答
0

我建议您在 NDB 错误跟踪器中为提议的新功能提交错误: http ://code.google.com/p/appengine-ndb-experiment/issues/list

于 2012-12-16T22:45:25.237 回答