«Select_for_update» вызывается внутри атомарного блока, все еще TransactionManagementError - PullRequest
0 голосов
/ 31 января 2019

Код удара

@transaction.atomic
def cancel_one(o_id):
    order= Order.objects.select_for_update().get(id=o_id)

повышает

TransactionManagementError ('select_for_update нельзя использовать вне транзакции.')

django.db.transaction.TransactionManagementError: select_for_update нельзя использовать вне транзакции.

Я проверил, что мой код находится в транзакции, transaction.get_connection().in_atomic_block.

Он появился в транзакции, но все еще вызывает

Ошибка: django.db.transaction.TransactionManagementError: select_for_update нельзя использовать вне транзакции.

Мой код:

# Step1
def cancel_one(o_id):
   print("DO")
   cxn = transaction.get_connection()
   if cxn.in_atomic_block:
       print("We're inside a transaction!")
   order= Order.objects.select_for_update().get(id=o_id)

# Step2
@transaction.atomic
def cancel_one(o_id):
   print("DO")
   cxn = transaction.get_connection()
   if cxn.in_atomic_block:
       print("We're inside a transaction!")
   order= Order.objects.select_for_update().get(id=o_id)

Результат кода

# Step1
-----------------------
DO
-----------------------

# Step2
-----------------------
DO
"We're inside a transaction!"
-----------------------

1 Ответ

0 голосов
/ 20 августа 2019

Вы случайно используете DBRouters?У меня были проблемы с этим - трюк состоял в том, чтобы определить базу данных для транзакции и выбрать___д_датку

with transaction.atomic(using='db_x'):
    order = Order.objects.using('db_x').select_for_update().get(id=o_id)
...