我正在處理幾天的問題,我真的很希望你能幫助我。在Node.js中處理回滾的MySQL事務
這是一個基於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鎖超時超時;嘗試重新啓動事務'。您應該查看MySQL服務器中的事務及其狀態。 –
這很清楚,爲什麼我得到這個錯誤。我正在尋找解決方案,我可以如何處理它。 – Adam
只有一種方法可以理解發生了什麼,它是'SHOW ENGINE INNODB STATUS \ G'。根據我的經驗,我在MySQL中多次發生了死鎖事務。 –