私は数日間の約束を扱っています。私は本当にあなたが私を助けることを望んでいます。Node.jsのロールバックされたMySQLトランザクションの処理
の場合はsequelize
を使用しているnode.js
のAPIです。
特定の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
何が起こるのかを理解する方法は1つだけあり、 'SHOW ENGINE INNODB STATUS \ G'です。私の経験では、私はデッドロックのトランザクションをMySQLで複数回取得しています。 –