节点 - Mysql 如果一个查询失败,事务不会回滚

Node - Mysql Transaction is not rolling back if one query fails

我正在尝试执行总共有三个查询的节点-mysql 事务。这三个都是 'INSERT' 查询。我故意写错了第三个查询来测试回滚,但是事务正在为前两个查询成功地进入数据库。

我知道类似的问题已经被问过好几次了,我几乎都试过了,但没有成功

exports.registerNewUserTransaction = async (
  res,
  userToBeAdded,
  nameToBeAdded,
  emailToBeAdded)  => {
  const conn = await db.getConnection();
  await conn.beginTransaction();
  try {
    await this.insertOne('user', userToBeAdded);
    await this.insertOne('name', nameToBeAdded);
    await this.insertOne('email', emailToBeAdded);
    await conn.commit();
    res.status(200);
  } catch(err) {
    await conn.rollback();
    res.status(400);
  } finally {
    await conn.release();
  }
};

如您所见,我正在从池中获取连接对象,开始事务并逐一执行查询。我的第三个查询有错误的列名,因此事务应该回滚但我看到前两个查询的条目。我真的很感激正确的方向。 节点版本:12.8.0 mysql(docker 中的运行):8.0.15 mysql(npm 版本):2.17.1

折腾了很久,终于想通了。答案如下:

exports.registerNewUserTransaction = async (
  res,
  userToBeAdded,
  nameToBeAdded,
  emailToBeAdded)  => {
  const conn = await db.getConnection();
  // My first mistake was not to promisify connection query 
  conn.query = util.promisify(conn.query);
  await conn.beginTransaction();
  try {
    // My second mistake was not to use same connection
    await conn.query('INSERT INTO ...', userToBeAdded);
    await conn.query('INSERT INTO ...', nameToBeAdded);
    await conn.query('INSERT INTO ...', emailToBeAdded);
    await conn.commit();
    return res.status(200);
  } catch(err) {
    await conn.rollback();
    return res.status(400);
  } finally {
    await conn.release();
  }
};

希望这对某人有所帮助!

这是我错过的重要部分。 conn.query = util.promisify(conn.query);