为了避免死锁,我所做的是实现一种在死锁发生时重试查询的方法。
为了做到这一点,我做的是对django的CursorWrapper类的方法“execute”进行了修补。无论何时进行查询,都会调用此方法,因此它将在整个ORM中工作,并且您不必担心项目中出现死锁:import django.db.backends.utils
from django.db import OperationalError
import time
original = django.db.backends.utils.CursorWrapper.execute
def execute_wrapper(*args, **kwargs):
attempts = 0
while attempts < 3:
try:
return original(*args, **kwargs)
except OperationalError as e:
code = e.args[0]
if attempts == 2 or code != 1213:
raise e
attempts += 1
time.sleep(0.2)
django.db.backends.utils.CursorWrapper.execute = execute_wrapper
上面的代码所做的是:它将尝试运行查询,如果错误代码1213(死锁)引发操作错误,它将等待200毫秒,然后重试。它将执行3次,如果3次后问题仍未解决,则会引发原始异常。
这段代码应该在django项目加载到内存中时执行,因此放在任何应用程序的__ini__.py文件中都是一个好地方(我放在项目主目录的__ini__.py文件中,该目录与django项目同名)。
希望这对将来的任何人都有帮助。