Postgresql 禁用自动提交时,查询后要做什么
在某些情况下,我们应该在查询之前Postgresql 禁用自动提交时,查询后要做什么,postgresql,jdbc,database-connection,database-cursor,autocommit,Postgresql,Jdbc,Database Connection,Database Cursor,Autocommit,在某些情况下,我们应该在查询之前setAutoCommit(false),请参见此处和 但是这些主题都没有提到当结果集和语句关闭但连接未关闭时(可由连接池或数据源回收)在查询后如何执行 我有以下选择: 不执行任何操作(保留autoCommit=false以备下次查询) 设置autoCommit=true 承诺 回滚 哪一种是最佳做法?这取决于你以后想做什么。如果要在操作后返回自动提交模式: conn.setAutoCommit(真); 这将自动提交打开的事务。甚至在事务中执行查询。如果您启
setAutoCommit(false)
,请参见此处和
但是这些主题都没有提到当结果集
和语句
关闭但连接
未关闭时(可由连接池
或数据源
回收)在查询后如何执行
我有以下选择:
- 不执行任何操作(保留
以备下次查询)autoCommit=false
- 设置
autoCommit=true
- 承诺
- 回滚
哪一种是最佳做法?这取决于你以后想做什么。如果要在操作后返回自动提交模式:
conn.setAutoCommit(真);
这将自动提交打开的事务。甚至在事务中执行查询。如果您启动了一个事务(在执行查询时隐式发生),那么您还应该结束它。通常,如果连接池表现良好,则在连接返回池时,不执行任何操作都会导致回滚。但是,最好不要依赖这种隐式行为,因为并非所有连接池或驱动程序都会遵守它。例如,OracleJDBC驱动程序将在连接关闭时提交(或者至少,它在过去是这样做的,我不确定它是否仍然提交),并且它可能不是您的程序的正确行为。显式调用
commit()
或rollback()
将清楚地记录程序的边界和期望
虽然提交或回滚仅执行查询(因此未修改数据库)的事务将具有相同的最终结果,但我建议使用commit()
而不是rollback()
,以清楚地表明结果是成功的。对于某些数据库,提交可能比回滚便宜(反之亦然),但如果结果相同,此类系统通常具有将提交转换为回滚的启发式方法(反之亦然,无论什么“便宜”)
完成后,通常不需要切换自动提交模式。一个行为良好的连接池应该为您做到这一点(尽管并非所有连接池都这样做,或者有时您需要显式配置)。仔细检查连接池的行为和选项,以确保安全
如果您想自己继续使用连接(而不返回池),那么切换回自动提交模式就足够了:使用活动事务调用
setAutoCommit(true)
将自动提交该事务。切换自动提交模式本身也将提交,因此,如果您连续使用这些语句,那么只使用setAutoCommit(true)
(不首先使用commit()
)就足够了。@MarkrotVeel我查看了代码,您是对的。