在mysql中重试死锁

7d7tgy0s  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(352)

我尝试在mysql和nodej中实现一个死锁重试策略,但是我缺少一些关于事务提交的信息。
我试着做的是,如果我得到一个错误的死锁,我会在短期交易后再次提交。
我是否需要再次运行所有的previos查询,或者重新提交就足够了?

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();
            });
        };
q9rjltbz

q9rjltbz1#

事务被回滚,因此需要再次执行查询。
实际上,您可能需要再次运行不同的查询(或者至少检查它们是否仍然有效),例如,通过再次将逻辑let应用于那些特定的查询。
死锁通常意味着您基于(或可能基于)决定对另一个事务已更改(或可能已更改)的数据执行特定查询(使用这些特定值),因此刚才运行的查询可能不再有效。否则,mysql可能会有一个函数来为您重复查询。

相关问题