代码之家  ›  专栏  ›  技术社区  ›  Amit Wagner

在mysql中重试死锁

  •  0
  • Amit Wagner  · 技术社区  · 6 年前

    我尝试在mysql和nodej中实现死锁的重试策略,但是我缺少一些关于事务提交的信息。

    我要做的是,如果我得到了一个错误的死锁,我会在一个短的交易后立即承诺。

    我需要运行所有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 回复  |  直到 6 年前
        1
  •  1
  •   Solarflare    6 年前

    您的事务将回滚,因此需要再次执行查询。

    实际上,你可能得跑 不同的 再次查询(或者至少检查它们是否仍然有效),例如,再次应用允许这些特定查询的逻辑。

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