[Sequelize在获得SequelizeDatabaseError后,正在创建悬挂/悬挂的mysql连接:ER_LOCK_DEADLOCK

问题描述 投票:0回答:1

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

  1. 在这样的死锁之后,与数据库的连接不会关闭。 MySQL show processlist显示卡在插入/更新查询中的这些连接。
  2. 这些连接很长时间没有关闭。
  3. 我的应用程序超时无法连接到数据库以进行进一步的请求。
  4. 此后长时间无法正常工作。

为什么会这样?理想情况下,如果Sequelize遇到错误,应该关闭连接吗?这是Sequelize的错误吗?

mysql node.js deadlock sequelize.js node-mysql
1个回答
0
投票

这似乎是截至2020年2月16日针对MariaDB和MySQL 5.7报道的Sequelize的错误。处理死锁条件的代码忽略了在检测到此特定错误条件时对事务进行清除的问题。当检测到ER_LOCK_DEADLOCK条件时,手动在事务上调用清除似乎是当前的解决方法。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.