2012-12-14 71 views
1

我正在使用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.transaction_async(callback, **ctx_options)NDB API中提供,但不是ndb.non_transaction_async(callback, **ctx_options)

我想知道是否需要在NDB API中公开ndb.non_transaction_async(callback, **ctx_options)函数来帮助我强有力地完成我想要做的事情?

回答

0

我建议你提交一个bug在NDB bug跟踪系统提出了新的特点: http://code.google.com/p/appengine-ndb-experiment/issues/list

+0

谢谢@guido,我看到你不再为此工作。 http://code.google.com/p/appengine-ndb-experiment/issues/detail?id=230&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary%20Stars – Dan

2

注意下面的装饰顺序按预期工作(因为1.7.3至少):

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

由于此bug,需要旧的db解决方法。

+0

这似乎确实有效。 –