概述
我已经搜索了一段时间了,找不到我的问题的解决方案.我们正在使用SQLAlchemy与
MySQL结合我们的项目,我们遇到几次可怕的错误:
1213, ‘Deadlock found when trying to get lock; try restarting transaction’.
在这种情况下,我们最多尝试重新启动交易三次.
我已经开始编写一个这样做的装饰器,但是我不知道如何在失败之前保存会话状态,并在之后重试相同的事务? (由于SQLAlchemy需要在引发异常时回滚)
我的工作到目前为止,
def retry_on_deadlock_decorator(func):
lock_messages_error = ['Deadlock found', 'Lock wait timeout exceeded']
@wraps(func)
def wrapper(*args, **kwargs):
attempt_count = 0
while attempt_count < settings.MAXIMUM_RETRY_ON_DEADLOCK:
try:
return func(*args, **kwargs)
except OperationalError as e:
if any(msg in e.message for msg in lock_messages_error)
and attempt_count <= settings.MAXIMUM_RETRY_ON_DEADLOCK:
logger.error('Deadlock detected. Trying sql transaction once more. Attempts count: %s'
% (attempt_count + 1))
else:
raise
attempt_count += 1
return wrapper
最后
以上就是贪玩花卷为你收集整理的sqlalchemy mysql死锁_python – 重试MySQL / SQLAlchemy的死锁的全部内容,希望文章能够帮你解决sqlalchemy mysql死锁_python – 重试MySQL / SQLAlchemy的死锁所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复