Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 禁用自动提交时,查询后要做什么_Postgresql_Jdbc_Database Connection_Database Cursor_Autocommit - Fatal编程技术网

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我查看了代码,您是对的。