【发布时间】:2016-05-04 05:55:01
【问题描述】:
我这几天一直在处理一个问题,我真的希望你能帮助我。
这是一个基于 node.js 的 API,使用 sequelize 表示 MySQL。
在某些 API 调用中,代码会启动锁定某些表的 SQL 事务,如果我同时向 API 发送多个请求,则会收到 LOCK_WAIT_TIMEOUT 错误。
var SQLProcess = function () {
var self = this;
var _arguments = arguments;
return sequelize.transaction(function (transaction) {
return doSomething({transaction: transactioin});
})
.catch(function (error) {
if (error && error.original && error.original.code === 'ER_LOCK_WAIT_TIMEOUT') {
return Promise.delay(Math.random() * 1000)
.then(function () {
return SQLProcess.apply(self, _arguments);
});
} else {
throw error;
}
});
};
我的问题是,同时运行的请求相互锁定了很长时间,我的请求在很长一段时间(~60秒)后返回。
我希望我能解释清楚易懂,你可以给我一些解决方案。
【问题讨论】:
-
这不是
node.js或sequelize麻烦,这是来自MySQL1205 Lock wait timeout exceeded; try restarting transaction的错误消息。您应该查看 MySQL 服务器中的事务及其状态。 -
非常清楚,为什么我会收到此错误。我正在寻找如何处理它的解决方案。
-
只有一种方法可以了解发生了什么,那就是
SHOW ENGINE INNODB STATUS\G。根据我的经验,我在 MySQL 中多次遇到死锁事务。 -
目前还不清楚您期望得到什么样的答案。 “把手”是什么意思?你想摆脱锁定(在这种情况下,你的
doSomething做什么很重要)?或者你想重复你的交易(在这种情况下,你为什么不从你的处理程序再次运行doSomething?或者你的catch语句不起作用,你想让它起作用?我有一个很大的列表与死锁有关的随机笔记here,现在我看起来很困惑,但是检查一下,也许你会发现一些有用的东西。
标签: javascript mysql node.js express sequelize.js