首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Sequelize是在获得SequelizeDatabaseError: ER_LOCK_DEADLOCK之后创建悬空/挂起的mysql连接。

Sequelize是在获得SequelizeDatabaseError: ER_LOCK_DEADLOCK之后创建悬空/挂起的mysql连接。
EN

Stack Overflow用户
提问于 2016-05-02 16:05:42
回答 1查看 2.9K关注 0票数 2

我有一个会计系统,在这个系统中,我尝试创建高并发性的事务(负载测试)。这将导致获取错误SequelizeDatabaseError: ER_LOCK_DEADLOCK:死锁;尝试从数据库(mysql)重新启动事务。根据MySQL,这是一个预期的错误,但在这种情况下,我观察到了一个独特的行为:

  1. 到数据库的连接在这种死锁之后不会关闭。MySQL show processlist显示这些连接卡在insert/update查询中。
  2. 这些连接在很长一段时间内不会关闭。
  3. 我的应用程序timesout连接到数据库以进行进一步的请求。
  4. 很长一段时间以来,它都没有起作用。

为什么会发生这种情况?理想情况下,如果连接出现错误,则后缀应该关闭,对吗?这是一个带有后遗症的bug吗?

EN

Stack Overflow用户

发布于 2020-02-16 21:55:57

这似乎是一个bug,据报道,截至2020年2月16日,MariaDB和MySQL 5.7的后遗症。当检测到此特定错误条件时,处理死锁条件的代码忽略对事务调用清理。当检测到ER_LOCK_DEADLOCK条件时,手动调用事务清理似乎是当前的工作。

例如。这样的代码可以解决这个问题。

代码语言:javascript
运行
复制
await sequelize.transaction(options, async t => {
    try {
        // transaction code
    } catch (e) {
        if (e instanceof db.Sequelize.DatabaseError
                && e.parent
                && e.parent.code === "ER_LOCK_DEADLOCK")
            await t.cleanup();
    }
 });

请参阅https://github.com/sequelize/sequelize/issues/11571

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36986782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档