禁用auto_commit的查询后该怎么办

时间:2020-05-14 14:24:59

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

在某些情况下,我们应在查询之前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未关闭时的查询后如何处理(可由ConnectionPool或{{ 1}})。

我有以下选择:

  • 不执行任何操作(保留DataSource用于下一个查询)
  • 设置autoCommit = false
  • 提交
  • 回滚

哪种方法最好?

2 个答案:

答案 0 :(得分:1)

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

尽管提交或回滚仅执行查询(因此未修改数据库)的事务将具有相同的最终结果,但我还是建议使用commit()而不是rollback()清楚表明结果是成功的。对于某些数据库,提交可能比回滚便宜(反之亦然),但是这种系统通常具有启发式功能,如果结果相同,则该启发式会将提交转换为回滚(反之亦然,更便宜)。 >

完成后,通常不需要切换自动提交模式。行为良好的连接池应该为您做到这一点(尽管并非全部都可以,或者有时您需要显式配置此功能)。仔细检查连接池的行为和选项,以确保确定。

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

答案 1 :(得分:0)

这取决于您以后要做什么。如果要在操作后返回自动提交模式:

conn.setAutoCommit(true);

这将自动提交未结交易。