Нетранзакционные операции в транзакционном тасклете

Я использую 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, чтобы помочь мне надежно выполнить то, что я хочу сделать?


person Dan    schedule 14.12.2012    source источник


Ответы (2)


Я рекомендую вам зарегистрировать ошибку для предлагаемой новой функции в системе отслеживания ошибок NDB: http://code.google.com/p/appengine-ndb-experiment/issues/list

person Guido van Rossum    schedule 16.12.2012
comment
Спасибо @guido, я вижу, вы больше не работаете над этим. code.google.com/p/appengine-ndb-experiment/issues/ - person Dan; 17.12.2012

Обратите внимание, что следующий порядок декораторов работает, как и ожидалось (по крайней мере, с версии 1.7.3):

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

Из-за этой ошибки.

person Piotr    schedule 06.01.2013