在原子块内调用的“ select_for_update”仍为TransactionManagementError

时间:2019-01-31 17:45:11

标签: django django-orm

代码打击

@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 :(得分:1)

您是否有机会使用DBRouters?我遇到了麻烦-诀窍是在事务上定义数据库并选择select_for_update

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