当前位置: 首页 > 知识库问答 >
问题:

MySQL会自动释放事务回滚时的连接吗?

欧阳山
2023-03-14

我以前在某人的代码里发现过这个。正如标题所说,调用rollback是否将连接释放回池中?

样品

router.post('/test', async (req, res, next) => {
  const connection = await database.getConnection();
  try {
    try {
      await connection.query(`INSERT INTO listings(num) VALUES ('1')`);
      await connection.query(`INSERT INTO listings(num) VALUES ('2')`);
      await connection.query(`INSERT INTO listings(num) VALUES ('3')`);
      await connection.commit();
    } finally {
      // all queries have executed, we can release the connection.
      connection.release();
    }
  } catch (err) {
    // will this also release the connection?
    await connection.rollback();
  }
});

更新

router.get('/x', async (req, res, next) => {
  try {
    const connection = await database.getConnection();
    try {
      await connection.query(`INSERT INTO listings(num) VALUES (1)`);
      await connection.query(`INSERT INTO listings(num) VALUES (2)`);
      await connection.query(`INSERT INTO listings(num) VALUES (3)`);
      await connection.commit();
    } catch (err) {
      // something happened roll back
      await connection.rollback();

      // due to this finally becomes unreachable?
      throw err;
    } finally {
      // all queries have executed, we can release the connection.
      connection.release();
    }
  } catch (err) {
    // error
  }
});

共有1个答案

蓝苗宣
2023-03-14

你发布的代码很奇怪,不是说不正确。没有任何理由使用两个嵌套的try/catch块。它们的使用方式违背了finally的目的。

在退出try/catch构造之前,执行finally块中的代码,无论它是如何完成的。

它将在try块中的代码执行之后执行,如果它没有引发任何异常,或者在catch块执行之后执行,如果引发了异常(由try块中的代码引发)。如果catch块中的代码抛出异常,它甚至会执行(这种异常在此级别无法捕获,它会被调用此函数的代码中最内部的try/catch块捕获。)

您的代码应该如下所示:

router.post('/test', async (req, res, next) => {
  const connection = await database.getConnection();

  try {
    await connection.query(`INSERT INTO listings(num) VALUES ('1')`);
    await connection.query(`INSERT INTO listings(num) VALUES ('2')`);
    await connection.query(`INSERT INTO listings(num) VALUES ('3')`);
    await connection.commit();
  } catch (err) {
    await connection.rollback();
  } finally {
    // all queries have executed, we can release the connection.
    connection.release();
  }
});

它在结束时释放连接,无论事务以何种方式结束。

 类似资料:
  • 问题内容: 我需要使MySQL服务器在客户端断开连接后立即回滚事务,因为每个客户端可以同时工作。可以 在客户端A 上重现这些问题(使用innodb表类型) : 在客户B上: 我已经设置了MySQL的服务器选项,并且在两个客户端上都使用了mysql的客户端。我在网络上使用一台服务器和两个客户端进行了尝试。下线后,我物理断开了网络连接(拔下电缆)。我需要使其他客户端能够立即在事务上使用(锁定它,更新它

  • 我们有一个Spring事务回滚问题,其中回滚似乎不起作用 在用注释的服务层方法中,我调用三个不同的类来插入3条记录 中间插入从第四个表执行get以填充描述字段,但此get失败。我希望第一次插入会回滚,但它似乎没有发生 几点: 获取方法抛出运行时异常 我们使用和中定义的。Bean是在中创建的,它被导入到 在层 中没有 注释 我们已经使用了

  • 问题内容: 如果在mysql命令列表中发生任何错误,是否可以自动回滚? 例如类似以下内容的东西: 现在,在执行我希望整个交易失败,因此我应该 不 看到值1在myTable的。但是不幸的是,即使事务有错误,该表也仍使用values1进行伪造。 任何想法,我如何使其回滚?(再次出现任何错误)? 编辑-从DDL更改为标准SQL 问题答案: 您可以使用13.6.7.2。DECLARE … HANDLER语

  • 我正在使用macOS BigSur。我使用ssh隧道在远程机器上的gpu上运行脚本。由于进程很长,我正在使用,我希望在断开与的连接时,进程继续运行。但问题是,当ssh断开时,

  • 我正在使用版本来使用来自主题的消息。在使用者配置中,自动提交设置为,而设置为。与服务器协商为10秒。 在收到消息后,我将它的一部分保存到数据库中。我的数据库有时会非常慢,这会导致kafka侦听器会话超时: 组MyGroup得自动偏移量提交失败:无法完成提交,因为组已重新平衡并将分区分配给另一个成员.这意味着对poll()的后续调用之间的时间比配置的session.timeout.ms长,这通常意味

  • 你能告诉我如何只对某些代码块运行事务吗?我有@Transactional的服务函数,并从它们调用存储库函数,在那里执行查询。但当查询失败时,由于事务必须结束,服务功能也随之失效。那么,当存储库函数失败时,如何返回null值呢?我需要在失败时捕获空值,并继续一些逻辑。我的代码: 我尝试了@davidxxx的答案,得到了这个错误: