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

时间:2015-04-07 06:36:12

标签: java postgresql jdbc batch-updates

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

根据JDBC规范,它起来了 到应用程序禁用自动提交和提交或 回滚交易。

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

根据JDBC规范“如果批量更新中的某个命令无法正确执行,则此方法将抛出一个  BatchUpdateException和JDBC驱动程序可能会也可能不会继续处理其余命令  在批处理中。“。这里没有说先前执行的命令将被回滚。

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

1 个答案:

答案 0 :(得分:1)

据我所知,规格基本上由驾驶员决定;如果批次失败,它不会指定是否已提交已处理的工作。

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

如果您觉得这种行为不正确,您需要做的第一件事是编写一个测试用例,证明其他驱动程序始终表现出与PgJDBC不同的方式并将其提交给the PgJDBC issue tracker。我们没有时间研究其他驱动程序的行为,因此您需要编写测试用例并运行其他一些流行的数据库(MS SQL Server,Oracle,DB2,MySQL等)或安排到让它由别人经营。如果您表明PgJDBC的行为与其他驱动程序处理批次的行为不同,那么它应该考虑添加一个更改行为的选项(并最终将其设置为默认行为)。