我尝试在mysql和nodej中对死锁实施重试策略,购买我缺少有关事务提交的一些信息。
我想做的是,如果我得到一个错误的死锁,我会在短暂的交易之后提交agian。
我是否需要运行所有previos查询agian或重新提交就足够了?
connection.commitTransaction = function () {
return new Promise((resolve, reject) => {
const commit = () => {
connection.commit(function (err) {
if (err) {
console.error("err.code", err.code);
if (err.code === 'ER_LOCK_DEADLOCK') {
setTimeout(() => {
commit();
}, 50);
return
}
return connection.rollback(function () {
connection.end();
reject(err);
});
}
connection.end();
resolve();
});
};
commit();
});
};
答案 0 :(得分:1)
您的交易会回滚,因此您需要再次执行查询。
实际上,您可能必须再次运行不同查询(或至少检查它们是否仍然有效),例如通过再次对那些特定的查询应用逻辑。
死锁通常意味着您基于(或可能已经基于)决定是基于已被(或可能已)被另一个事务更改的数据执行特定查询(具有这些特定值),因此您刚运行的查询可能不再有效。否则,MySQL可能会具有为您重复查询的功能。