禁用 auto_commit 后查询后的操作
What to do after a query when auto_commit is disabled
在某些情况下,我们应该setAutoCommit(false)
在查询之前,请参阅此处https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor and When does the PostgreSQL JDBC driver fetch rows after executing a query?。
但是none这些题目提到查询后,当ResultSet
和Statement
关闭但Connection
不关闭时怎么办(可能被[=回收15=] 或 DataSource
).
我有这些选择:
- 什么都不做(保留
autoCommit = false
用于下一个查询)
- 设置
autoCommit = true
- 提交
- 回滚
哪个是最佳做法?
这取决于你之后想做什么。如果你想return在操作后自动提交模式:
conn.setAutoCommit(true);
这将自动提交打开的事务。
即使查询也是在事务中执行的。如果您启动了一个事务(在您执行查询时隐式发生),那么您也应该结束它。通常,什么都不做 - 使用行为良好的连接池 - 当您的连接返回到池时会导致回滚。但是,最好不要依赖这种隐式行为,因为并非所有连接池或驱动程序都会遵守它。例如,Oracle JDBC 驱动程序将在连接关闭时提交(或者至少,它过去这样做过,我不确定它是否仍然这样做),这可能不是您程序的正确行为。显式调用 commit()
或 rollback()
将清楚地记录程序的边界和期望。
虽然提交或回滚只执行查询(因此不修改数据库)的事务将具有相同的最终结果,但我建议使用 commit()
而不是 rollback()
, 以清楚地表明结果是成功的。对于某些数据库,提交可能比回滚成本更低(反之亦然),但此类系统通常具有启发式方法,可以将提交转换为回滚(反之亦然,无论 'cheaper' 是什么),前提是结果相同。
完成后通常不需要切换自动提交模式。一个行为良好的连接池应该为你做到这一点(虽然不是所有人都这样做,或者有时你需要明确地配置它)。仔细检查连接池的行为和选项以确定。
如果您想自己继续使用连接(不返回池),那么切换回自动提交模式就足够了:使用活动事务调用 setAutoCommit(true)
将自动提交该事务。
在某些情况下,我们应该setAutoCommit(false)
在查询之前,请参阅此处https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor and When does the PostgreSQL JDBC driver fetch rows after executing a query?。
但是none这些题目提到查询后,当ResultSet
和Statement
关闭但Connection
不关闭时怎么办(可能被[=回收15=] 或 DataSource
).
我有这些选择:
- 什么都不做(保留
autoCommit = false
用于下一个查询) - 设置
autoCommit = true
- 提交
- 回滚
哪个是最佳做法?
这取决于你之后想做什么。如果你想return在操作后自动提交模式:
conn.setAutoCommit(true);
这将自动提交打开的事务。
即使查询也是在事务中执行的。如果您启动了一个事务(在您执行查询时隐式发生),那么您也应该结束它。通常,什么都不做 - 使用行为良好的连接池 - 当您的连接返回到池时会导致回滚。但是,最好不要依赖这种隐式行为,因为并非所有连接池或驱动程序都会遵守它。例如,Oracle JDBC 驱动程序将在连接关闭时提交(或者至少,它过去这样做过,我不确定它是否仍然这样做),这可能不是您程序的正确行为。显式调用 commit()
或 rollback()
将清楚地记录程序的边界和期望。
虽然提交或回滚只执行查询(因此不修改数据库)的事务将具有相同的最终结果,但我建议使用 commit()
而不是 rollback()
, 以清楚地表明结果是成功的。对于某些数据库,提交可能比回滚成本更低(反之亦然),但此类系统通常具有启发式方法,可以将提交转换为回滚(反之亦然,无论 'cheaper' 是什么),前提是结果相同。
完成后通常不需要切换自动提交模式。一个行为良好的连接池应该为你做到这一点(虽然不是所有人都这样做,或者有时你需要明确地配置它)。仔细检查连接池的行为和选项以确定。
如果您想自己继续使用连接(不返回池),那么切换回自动提交模式就足够了:使用活动事务调用 setAutoCommit(true)
将自动提交该事务。