【问题标题】:What to do after a query when auto_commit is disabled禁用 auto_commit 时查询后的操作
【发布时间】:2020-08-31 03:09:33
【问题描述】:

在某些情况下,我们应该在查询之前setAutoCommit(false),请参阅此处https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursorWhen does the PostgreSQL JDBC driver fetch rows after executing a query?

但是这些主题都没有提到查询后如何做,当ResultSetStatement关闭但Connection没有关闭(可能被ConnectionPoolDataSource回收)。

我有以下选择:

  • 什么都不做(保留autoCommit = false 以便下次查询)
  • 设置autoCommit = true
  • 提交
  • 回滚

哪一个是最佳实践?

【问题讨论】:

    标签: postgresql jdbc database-connection database-cursor autocommit


    【解决方案1】:

    这取决于你之后想做什么。如果你想在操作后返回自动提交模式:

    conn.setAutoCommit(true);
    

    这将自动提交打开的事务。

    【讨论】:

    • 切换自动提交模式本身也会提交,所以如果你连续使用这些语句,那么只使用setAutoCommit(true)(先不使用commit())就足够了。
    • @MarkRotteveel 我查看了代码,你是对的。
    【解决方案2】:

    甚至查询也在事务中执行。如果您启动了一个事务(在执行查询时隐式发生),那么您也应该结束它。通常,如果连接池表现良好,什么都不做会导致连接返回池时回滚。但是,最好不要依赖这种隐式行为,因为并非所有连接池或驱动程序都会遵守它。例如,Oracle JDBC 驱动程序将在连接关闭时提交(或者至少,它在过去这样做过,我不确定它是否仍然如此),并且它可能不是您的程序的正确行为。显式调用commit()rollback() 将清楚地记录您的程序的边界和期望。

    虽然提交或回滚只执行查询(因此没有修改数据库)的事务将得到相同的最终结果,但我建议使用commit() 而不是rollback(),以清楚地表明结果是成功的。对于某些数据库,提交可能比回滚便宜(反之亦然),但如果结果相同,此类系统通常具有将提交转换为回滚的启发式方法(反之亦然,任何“便宜”)。

    完成后,您通常不需要切换自动提交模式。一个表现良好的连接池应该为您做到这一点(尽管不是所有的都这样做,或者有时您需要显式配置它)。仔细检查您的连接池的行为和选项以确保。

    如果您想自己继续使用连接(而不返回池),则切换回自动提交模式就足够了:使用活动事务调用 setAutoCommit(true) 将自动提交该事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-22
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      相关资源
      最近更新 更多