当使用 Gunicorn 与多个进程/工作人员一起运行 Django 时,我的一些手动 MySQL 数据库事务遇到了死锁问题。
DatabaseError(1205, 'Lock wait timeout exceeded; try restarting transaction')
我的设置使用多个数据库,并且我的函数需要在调用时传递给数据库才能使用。出于这个原因,我不能使用标准的Django 事务装饰器,因为 db 需要硬编码为参数。我检查了装饰器代码以了解事务是如何管理的,我的函数如下所示:
from django.db import connections
def process(self, db, data):
# Takeover transaction management
connections[db].enter_transaction_management(True)
connections[db].managed(True)
# Process
try:
# do things with my_objects...
for obj in my_objects:
obj.save(using=db)
connections[db].commit()
except Exception as e:
connections[db].rollback()
finally:
connections[db].leave_transaction_management()
谁能发现这里可能出了什么问题?