Я использую 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 советует не комбинировать такие декораторы, как это делается с @ndb.tasklet
и @ndb.transactional
и вместо этого использовать функцию ndb.transaction_async(callback, **ctx_options)
. См. здесь для решения этой проблемы. Поэтому я обеспокоен тем, что объединение декораторов @ndb.tasklet
и @ndb.non_transactional
также может быть хрупким и склонным к неожиданному поведению.
Обратите внимание, что ndb.transaction_async(callback, **ctx_options)
предоставляется в API NDB, но не ndb.non_transaction_async(callback, **ctx_options)
.
Интересно, нужно ли предоставлять функцию ndb.non_transaction_async(callback, **ctx_options)
в NDB API, чтобы помочь мне надежно выполнить то, что я хочу сделать?