django - 在原子块内调用的“select_for_update”仍然是 TransactionManagementError
问题描述
代码爆炸
@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!"
-----------------------
解决方案
您是否有机会使用 DBRouters?我遇到了麻烦-技巧是在事务和 select_for_update 上定义数据库
with transaction.atomic(using='db_x'):
order = Order.objects.using('db_x').select_for_update().get(id=o_id)
推荐阅读
- binary - 这表示它有两个 2 位输入,所以如何找到真值表
- java - 尝试通过 SSH 隧道连接 PostgreSQL 时连接尝试失败。我将 Java 与 jsch lib 一起使用
- react-native - react-native-fs - 错误:尝试在空对象引用上调用虚拟方法'byte [] java.lang.String.getBytes()'
- vert.x - 增加 vetx 服务器的超时时间
- reactjs - 在 setState 和 useState 之后,history.push 不起作用
- python - 遇到错误:启动 Jupyter 笔记本时没有名为“编码”的模块
- python - 如何通过电子邮件邀请链接邀请用户加入群组?
- python - Pandas:groupby() 下的 rank() 返回“ValueError:传递的项目数错误 2,位置暗示 1”
- windows - Gitlab管道启动powershell
- rust - 如何使用 None 值序列化/反序列化地图