解决django.db.utils.OperationalError: (1213, 'Deadlock found when trying to get lock; try restarting transaction') 死锁问题
原因:因为设置了SESSION_SAVE_EVERY_REQUEST=Ture
,导致每个接口没有修改的状态下也更改session的过期时间。
-
查看代码发现SessionMiddleware源码,遇到UpdateError异常直接抛出。
try: request.session.save() except UpdateError: raise SuspiciousOperation( "The request's session was deleted before the " "request completed. The user may have logged " "out in a concurrent request, for example." )
-
创建一个新的中间件类,继承自SessionMiddleware
import time from django.db import transaction from django.contrib.sessions.backends.base import UpdateError from django.contrib.sessions.middleware import SessionMiddleware class CustomSessionMiddleware(SessionMiddleware): # 继承SessionMiddleware 遇到异常重试3次 def process_response(self, request, response): try: return super().process_response(request, response) except Exception as e: print('errors: {}'.format(e)) max_retries = 3 retries = 0 success = False while retries < max_retries and not success: try: with transaction.atomic(): request.session.save() success = True except UpdateError: print('试图获得锁时发现死锁;尝试重新启动事务!') retries += 1 time.sleep(1) if not success: # 处理超过最大重试次数的情况 if request.method == "POST": print(request.body, '================>') else: print(request.GET, '================>') print('OperationalError 异常已经重试最大次数') return response
-
在Django的配置文件(settings.py)中将默认的SessionMiddleware替换为自定义的中间件。
MIDDLEWARE = [ # 'django.contrib.sessions.middleware.SessionMiddleware', # 重写SessionMiddleware 'middleware.session.CustomSessionMiddleware', ]
作者:就学45分钟
出处:https://www.cnblogs.com/tjw-bk/p/17535445.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
分类:
Django-项目开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了