我有一个会计系统,在这个系统中,我尝试创建高并发性的事务(负载测试)。这将导致获取错误SequelizeDatabaseError: ER_LOCK_DEADLOCK:死锁;尝试从数据库(mysql)重新启动事务。根据MySQL,这是一个预期的错误,但在这种情况下,我观察到了一个独特的行为:
show processlist
显示这些连接卡在insert/update查询中。为什么会发生这种情况?理想情况下,如果连接出现错误,则后缀应该关闭,对吗?这是一个带有后遗症的bug吗?
发布于 2020-02-16 21:55:57
这似乎是一个bug,据报道,截至2020年2月16日,MariaDB和MySQL 5.7的后遗症。当检测到此特定错误条件时,处理死锁条件的代码忽略对事务调用清理。当检测到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://stackoverflow.com/questions/36986782
复制相似问题