1

Google App EngineSDK1.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の作成者は、andで行われるようなデコレータを組み合わせず、代わりに関数を使用することをお勧めします。これを行う際の問題については、ここを参照してください。したがって、とデコレータを組み合わせると、壊れやすく、予期しない動作が発生しやすくなる可能性があるのではないかと心配しています。@ndb.tasklet@ndb.transactionalndb.transaction_async(callback, **ctx_options)@ndb.tasklet@ndb.non_transactional

これはNDBAPIndb.transaction_async(callback, **ctx_options)で提供されていますが、では提供されていないことに注意してください。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)
  # ...

このバグのため、古いdbの回避策が必要です。

于 2013-01-06T01:03:36.303 に答える
0

NDBバグトラッカーで提案された新機能のバグを報告することをお勧めします: http ://code.google.com/p/appengine-ndb-experiment/issues/list

于 2012-12-16T22:45:25.237 に答える