3

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

根据 JDBC 规范,由应用程序来禁用自动提交以及提交或回滚事务。

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

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

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

4

1 回答 1

1

据我所知,规范基本上把这留给了司机。如果批处理失败,它没有指定是否提交已处理的工作。

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

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

于 2015-04-07T07:35:57.293 回答