Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django和mysql设置中死锁后自动重试可用的钩子_Mysql_Django_Mysql Python - Fatal编程技术网

django和mysql设置中死锁后自动重试可用的钩子

django和mysql设置中死锁后自动重试可用的钩子,mysql,django,mysql-python,Mysql,Django,Mysql Python,我正在Django中使用innoDB表和mysql数据库。在错误调查期间 操作错误:(1213,“尝试获取锁时发现死锁;尝试重新启动事务”) 我是从学校来的。在答案的最后一部分,他提出了建议 客户端应自动重试 我试图把这个逻辑放在代码中,但同时django中是否有直接可用的钩子。因此,我们可以设置3次自动重试,以防死锁。另外,如果有人能给出将此逻辑放入代码中的示例(我使用的是django过滤器) PS:我本可以在Omry的答案下面问这个问题,但我的分数低于50分,我还想把它带给django专家。

我正在Django中使用innoDB表和mysql数据库。在错误调查期间

操作错误:(1213,“尝试获取锁时发现死锁;尝试重新启动事务”)

我是从学校来的。在答案的最后一部分,他提出了建议

客户端应自动重试

我试图把这个逻辑放在代码中,但同时django中是否有直接可用的钩子。因此,我们可以设置3次自动重试,以防死锁。另外,如果有人能给出将此逻辑放入代码中的示例(我使用的是django过滤器)


PS:我本可以在Omry的答案下面问这个问题,但我的分数低于50分,我还想把它带给django专家。

这是一个老问题,但因为没有人给出答案,所以答案在这里

为了在死锁发生时重试查询,我所做的是对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
导入django.db.backends.utils 从django.db导入错误 导入时间 original=django.db.backends.utils.CursorWrapper.execute def execute_包装(*args,**kwargs): 尝试次数=0 当尝试<3时: 尝试: 返回原件(*args,**kwargs) 除e以外的操作错误: 代码=e.args[0] 如果尝试次数==2或代码!=1213: 提高e 尝试次数+=1 睡眠时间(0.2) django.db.backends.utils.CursorWrapper.execute=execute\u wrapper 上面的代码所做的是:它将尝试运行查询,如果抛出操作错误,错误代码为1213(死锁),它将等待200毫秒,然后重试。它将执行此操作3次,如果在3次之后问题仍未解决,则会引发原始异常

此代码应该在django项目加载到内存中时执行,因此最好将其放在任何应用程序的
\uuuu init\uuuuuuuuuuuupy
文件中(我放在我的项目主目录的
\uuuuuu init\uuuuuuuuuuuuuuupy
文件中,该文件与django项目同名)


希望这对将来的任何人都有帮助。

您正在执行什么代码,以及它在django项目中的位置?嗨,Timmy,谢谢您的关注。我使用django_auth_ldap将ldap服务器与数据库同步。在其中一个manage_user调用(创建/删除/更新用户详细信息)期间,我使ldap_backend.populate_user()[这是将所有ldap组与django auth_user_组同步]。这使得mysql陷入了死锁。非常感谢,我正在使用类似于修复
操作错误:(2006,“mysql服务器已经消失”)
,但是我使用的不是我自己的包装代码,而是:Yes。这个解决方案很有效。现在我们看到以下错误。操作错误:(1305,‘保存点s139806324311104_x9不存在’)。我的事务在My views.py中是原子的。有人能帮忙解决这个问题吗?