重试 MySQL / SQLAlchemy 的死锁

2024-02-16

我已经搜索了很长一段时间,但找不到解决我的问题的方法。我们在项目中将 SQLAlchemy 与 MySQL 结合使用,并且多次遇到可怕的错误:

1213, '尝试获取锁定时发现死锁;尝试重新启动事务”。

在这种情况下,我们最多尝试重新启动交易三次。

我已经开始编写一个装饰器来执行此操作,但我不知道如何在失败之前保存会话状态并在失败之​​后重试相同的事务? (因为 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

你真的不能用Session从外部。Session必须在内部支持这一点。这将涉及保存大量私有状态,因此这可能不值得您花时间。

我完全放弃了大多数 ORM 内容,转而使用较低级别的 SQLAlchemy Core 接口。使用它(甚至任何 dbapi 接口),您可以轻松地使用您的retry_on_deadlock_decorator装饰器(参见上面的问题)以进行重试感知db.execute包装纸。

 @retry_on_deadlock_decorator
 def deadlock_safe_execute(db, stmt, *args, **kw):
     return db.execute(stmt, *args, **kw)

而不是

 db.execute("UPDATE users SET active=0")

you do

 deadlock_safe_execute(db, "UPDATE users SET active=0")

如果发生死锁,它将自动重试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重试 MySQL / SQLAlchemy 的死锁 的相关文章

  • 在 SQLAlchemy 中,过滤器是在连接之前还是之后应用?

    使用 SQLAlchemy 我执行如下查询 import models as m import sqlalchemy as sa s session maker q s query m ShareCount m Article join m
  • 多人/单人测验游戏的数据库设计

    我在这里看到了很多问题 但没有人适合我的问题 我正在尝试创建一个可扩展的 ER 模型 如果我想添加更多数据 则不会破坏几乎任何东西 所以我尝试创建的是 有两种类型的用户 比如说管理员和工作人员 他们有不同的角色 管理员可以对问题进行 CRU
  • caffe安装:opencv libpng16.so.16链接问题

    我正在尝试在 Ubuntu 14 04 机器上使用 python 接口编译 caffe 我已经安装了 Anaconda 和 opencvconda install opencv 我还安装了咖啡中规定的所有要求 并更改了注释块makefile
  • 创建 xyz 海拔数据的曲面图

    我正在尝试用 python 创建一座山的表面图 其中我有一些 xyz 数据 最终结果应该类似于that https i stack imgur com rKQV0 png 该文件的格式如下 616000 0 90500 0 3096 712
  • 如何在Python + Selenium中获取元素的值

    我在我的 Python 3 6 3 代码中得到了这个 HTML 元素 作为 Selenium网页元素当然 span class ocenaCzastkowa masterTooltip style color 000000 alt 5 sp
  • 删除 tkinter 文本默认绑定

    我正在制作一个简单的 tkinter 文本编辑器 但我想要所有默认绑定文本小部件如果可能的话删除 例如当我按Ctrl i它默认插入一个制表符 我制作了一个事件绑定来打印文本框中有多少行 我将事件绑定设置为Ctrl i以及 当我运行它时 它会
  • 无法使用Python请求会话模块登录网站

    我刚刚开始进行网络抓取 对于我的第一个项目 我尝试使用 requests Session 登录 artofproblemsolving com 并访问另一个用户的帐户 这是我的代码 import requests LOGIN URL htt
  • cxfreeze virtualenv 中缺少 distutils 模块

    从 python3 2 项目运行 cxfreeze 二进制文件时 我收到以下运行时错误 project dist project distutils init py 13 UserWarning The virtualenv distuti
  • argparse 不检查位置参数

    我正在创建一个脚本 它使用 argparse 接受位置参数和可选参数 我已经阅读了 Doug 的教程和 python 文档 但找不到答案 parser argparse ArgumentParser description script t
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • Pandas 中每列的曲线拟合 + 外推值

    我有一个包含大约 300 列的数据集 每一列都与深度相关 Pandas DataFrame 的简化版本看起来像这样 import matplotlib pyplot as plt import numpy as np import pand
  • 为什么 pip 已经是最新的了却要求我升级?

    我全新安装了 python 3 7 1 64 位 并使用最新的 pyCharm 作为我的 IDE 我在这台机器上没有安装其他 python 我去安装 numpy 并收到以下消息 venv C Users John PycharmProjec
  • “KMeans”对象没有属性“k”

    我使用 Yellowbrick 包绘制数据集的肘部曲线 以使用 KMeans 作为模型找到数据集的最佳簇数 我正在使用 Scikit learn KMeans 和 Yellowbrick kelbowvisualizer 函数 生成了肘部曲
  • 如何优化这个查询(涉及4毫米表)

    我正在使用如下所示的遗留数据库架构 product table表有字段 uid 整数 主键 name varchar 50 category表有字段 uid 整数 主键 name varchar 50 好吧 现在product table与
  • 将 str.contains 映射到 pandas DataFrame

    python 初学者 我正在寻找创建字符串的字典映射以及关联的值 我有一个数据框 想要创建一个新列 如果字符串匹配 则会将该列标记为 x df pd DataFrame comp dell notebook dell notebook S3
  • 解析整数集的字符串并列出间隔

    I have 2 5 7 9 12 string 我想从中获取 2 5 7 8 9 12 列表 python中有没有内置的函数 Thanks UPD 我想 直接的答案是No 不管怎样 谢谢你的 片段 使用一个 建议者斯文 马尔纳克 s 2
  • 如何将 django ModelForm 字段显示为不可编辑

    接受我的初步教训django ModelForm 我想让用户能够编辑博客中的条目 BlogEntry has a date postedTime title and content 我想向用户展示一个编辑表单 其中显示所有这些字段 但仅包含
  • 将二进制数据视为文件对象?

    在此代码片段 由另一个人编写 中 self archive是一个大文件的路径并且raw file是以二进制数据形式读取的文件内容 with open self archive rb as f f seek offset raw file s
  • 关闭正在运行代码的 IPython Notebook

    怎么运行的 我在 IPython Notebook 中运行了一些代码 一些迭代工作 我不小心关闭了正在运行的笔记本的浏览器 但回到 IPython 仪表板 我发现这个特定的笔记本尚未关闭 所以如果我再次打开笔记本 我会在它正在执行的代码前面
  • 如何使用 keras.backend.gradients() 获取梯度值

    我试图获得 Keras 模型的输出相对于模型输入 x 而不是权重 的导数 似乎最简单的方法是使用 keras backend 中的 梯度 它返回梯度张量 https keras io backend https keras io backe

随机推荐

  • 使用 NSMutableString 追加到文件末尾

    我有一个日志文件 我试图将数据附加到其末尾 我有一个NSMutableString textToWrite变量 我正在执行以下操作 textToWrite writeToFile filepath atomically YES encodi
  • 从 ASP.NET MVC2 升级到 MVC3 的原因 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用此关键字并揭示模块模式的严格违规

    无法让以下内容通过 jslint jshint jshint strict true var myModule function use strict var privVar true pubVar false function privF
  • MFC/WinAPI 的大问题

    我需要创建一个带有两个选项卡的表单视图的 SDI 表单 其中封装了多个对话框作为选项卡内容 但表格必须有彩色背景 诸如此类的事情让我讨厌编程 首先 我通过资源编辑器尝试了 CTabControl 尝试了不同的事情 但未记录的行为和没有答案的
  • 使用多个自定义表模型避免重复代码

    我正在从事一个项目 其中我们有几个领域类来对业务数据进行建模 这些类是简单的 POJO 我必须使用它们来显示几个表 例如 考虑这个类 public class Customer private Long id private Date en
  • IntelliJ 中的“用 try...catch 换行”?

    我可以选择一段代码并让 IntelliJ 用 try catch 将其包装起来吗 有键盘快捷键吗 选择代码 然后 Choose Code gt Surround With 按 Ctrl Alt T 对于 OS X 命令 选项 T 有时我喜欢
  • 如何修复 Mountain Lion 中的 VIM 系统剪贴板使用问题

    set clipboard unnamed是我最喜欢的之一 vimrc配置 多亏了它 猛拉和删除被复制到我的系统剪贴板 我可以轻松地将它们粘贴到其他应用程序 然而 当我升级到 Mountain Lion 时 这个设置就崩溃了 你知道如何解决
  • 更改 JButtons 背景的最佳方法

    现在我使用以下方法更改按钮的背景颜色 button setBackground Color WHITE 这是一个例子 但是当我有一个巨大的 jbuttons 网格 1000 时 仅仅运行一个 for 循环来改变每个按钮的背景是非常非常慢的
  • Hibernate - TypedQuery.getResultList() 返回同一对象的列表

    这是对问题的更多也许更好的描述 我做了一个简单的选择查询 返回的列表包含确切数量的记录 对象 就像我在数据库中执行相同的查询一样 但问题是所有对象都是相同 相同的 例如 这是数据库中的结果 我删除了空值 26801 01 JAN 00 7
  • 构建 Windows 版 Linphone 时出错

    我正在尝试按照以下说明构建适用于 Windows 的 linphoneReadme mingw使用 MinGw Msys 在下载belle sip包之前没有任何问题 当我跑步时 autogen sh我收到以下错误 Generating bu
  • Ruby 多字符串替换

    str Hello World 预期输出是 Hello World 我可以做这个 str gsub gsub 有没有其他方法可以在单个函数调用中完成此操作 就像是 str gsub s1 s2 r1 r2 从 Ruby 1 9 2 开始 S
  • RPG - 存储半复杂树结构的玩家数据

    我正在 js 中制作一个 web RPG 使用 melon JS 和 SQL DB 以及 PHP 这个问题是关于如何存储每个非玩家角色 NPC 的已完成任务和当前任务 NPC对话和任务数据 所有对话框都存储在一个js对象中 结构如下 var
  • 朱莉娅 评估数学树的最快方法是什么

    I have a tree of data representing a mathematical function like this 它存储在数组中 因此 2 3 2 将表示为 2 2 3 为了实际评估树 我有一个递归函数 functi
  • 在文本框中输入时搜索列表 VueJS 2

    我有一个来自数组的用户列表 我想根据顶部的搜索框 名称 过滤它们 我看到VueJS 1中有过滤器 但在VuesJS 2中不可用 如何在VueJS 2中实现这一点
  • 以内核模式运行的进程和以 root 身份运行的进程之间的区别?

    我知道在用户模式下运行的进程和在内核模式下运行的进程之间的区别 基于访问限制 对硬件的访问等 但出于好奇 以内核模式运行的进程与以 root 身份运行的进程有什么区别 内核模式和根是两个独立的概念 彼此之间并不真正相关 以 root 身份运
  • 对象创建语法之间的区别[重复]

    这个问题在这里已经有答案了 请解释对象一和对象二之间的区别 car one new opel opel two new opel 欧宝类扩展了汽车类 你可以重新分配one到某个其他子类的对象car one new Ford 但你不能重新分配
  • 如何在 BigQuery 的标准 SQL 中实现 RATIO_TO_REPORT()?

    我有一个使用 RATIO TO REPORT 的旧版 SQL 查询 它不使用开放访问表 但它是这样的 SELECT Mutation AA Gene name CaseCount RATIO TO REPORT CaseCount OVER
  • Angular2中如何将值从一个组件传递到另一个组件?

    我正在尝试将值从 Angular2 中的一个组件传递到另一个组件 例如 我正在尝试实现一个组件并在该组件中设置数据和标题 然后将该数据和标题传递给嵌入其中的另一个组件 这是更好解释的代码
  • 施特拉森的矩阵乘法在哪里有用?

    Strassen 的矩阵乘法算法仅比传统算法略有改进O N 3 算法 它具有更高的常数因子并且更难以实现 鉴于这些缺点 strassens 算法实际上有用吗 它是否在任何矩阵乘法库中实现 此外 矩阵乘法在库中是如何实现的 一般来说 施特拉森
  • 重试 MySQL / SQLAlchemy 的死锁

    我已经搜索了很长一段时间 但找不到解决我的问题的方法 我们在项目中将 SQLAlchemy 与 MySQL 结合使用 并且多次遇到可怕的错误 1213 尝试获取锁定时发现死锁 尝试重新启动事务 在这种情况下 我们最多尝试重新启动交易三次 我