重试MySQL中的死锁

时间:2018-07-17 05:36:08

标签: mysql node.js

我尝试在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();
            });
        };

1 个答案:

答案 0 :(得分:1)

您的交易会回滚,因此您需要再次执行查询。

实际上,您可能必须再次运行不同查询(或至少检查它们是否仍然有效),例如通过再次对那些特定的查询应用逻辑。

死锁通常意味着您基于(或可能已经基于)决定是基于已被(或可能已)被另一个事务更改的数据执行特定查询(具有这些特定值),因此您刚运行的查询可能不再有效。否则,MySQL可能会具有为您重复查询的功能。