我有一个会计系统,我尝试以高并发性(负载测试)创建事务。这导致获取错误SequelizeDatabaseError:ER_LOCK_DEADLOCK:尝试获取锁定时发现死锁;尝试从数据库重启事务(mysql)。根据MySQL,这是一个预期的错误,但我在这种情况下观察到一种独特的行为:
show processlist
显示这些连接卡在插入/更新查询中。为什么会这样?理想情况下Sequelize应该关闭连接,如果它出错了吗?这是Sequelize的错误吗?
答案 0 :(得分:3)
自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();
}
});