我已经遇到一个问题几天了,真的希望你能帮助我。
这是一个基于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
的问题,而是来自MySQL的错误信息1205 Lock wait timeout exceeded; try restarting transaction
。你应该查看MySQL服务器中的事务和它们的状态。 - Vlad ChurakovSHOW ENGINE INNODB STATUS\G
。根据我的经验,在MySQL中我多次遇到死锁事务。 - Vlad ChurakovdoSomething
做了什么很重要)?还是你想要重复你的事务(在这种情况下,为什么不从你的处理程序再次运行doSomething
?或者你的catch
语句不起作用,你想让它起作用?我有一个与死锁相关的大量随机笔记列表在这里,现在看起来对我来说很困惑,但是请查看一下,也许你会找到一些有用的东西。 - Borys Serebrov