java - Postgresql JDBC 驱动程序中的批量更新在自动提交中回滚

标签 java postgresql jdbc batch-updates

我正在使用 postgres 9.3-1100-jdbc41 JDBC4 驱动程序进行批量插入。

根据JDBC规范,其up 应用程序禁用自动提交并提交或 回滚事务。

在我的例子中,我没有使用任何事务(即,自动提交为真),但如果批处理中的一个插入失败,插入仍然会回滚。

根据 JDBC 规范“如果批量更新中的命令之一未能正确执行,此方法将抛出一个 BatchUpdateException,并且 JDBC 驱动程序可能会或可能不会继续处理剩余的命令 in the batch."。这里并没有说之前执行的命令会被回滚。

我的理解有误吗?如果不是,为什么驱动程序会以这种方式表现,如果是,根据规范,正确的行为是什么。

最佳答案

据我所知,规范基本上将其留给了驱动程序;如果批处理失败,它没有指定是否提交已处理的工作。

PgJDBC 在事务中执行批处理,因此如果批处理的任何部分失败,那么它将全部中止。

如果您觉得这种行为不正确,您需要做的第一件事就是编写一个测试用例来证明其他驱动程序始终以不同的方式运行 PgJDBC,并将其提交给 the PgJDBC issue tracker .我们没有时间研究其他驱动程序的行为,所以您需要编写测试用例并在其他一些流行的数据库(MS SQL Server、Oracle、DB2、MySQL 等)上运行它,或者安排让它由其他人运行。如果您表明 PgJDBC 的行为与其他驱动程序处理批处理的方式不同,那么值得考虑添加一个选项来更改行为(并努力最终使其成为默认行为)。

关于java - Postgresql JDBC 驱动程序中的批量更新在自动提交中回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29485287/

相关文章:

java - 这个归并排序有什么问题呢?

java - 在 JNI 中获取并打印字符串数组

java - java中更新对象的问题

jdbc - 由于 : java. io.EOFException 导致通信链路失败

mysql - Tomcat 7 和 Idea ide 的 JDBC 问题

java - 使用 IdClass 连接表

postgresql - 序列化失败 (40001)

mysql - Postgresql 错误 (heroku) - 在 mysql 上本地工作

sql - 比较 inner join 和 where in 的用法

java - 无法在 postgresql 中使用 AND 运算符更新数据库中的值