【发布时间】:2015-04-07 06:36:11
【问题描述】:
我正在使用 postgres 9.3-1100-jdbc41 JDBC4 驱动程序进行批量插入。
根据 JDBC 规范,它的 up 向应用程序禁用自动提交并提交或 回滚事务。
在我的情况下,我没有使用任何事务(即自动提交为真),但如果批处理中的一个插入失败,插入仍然会回滚。
根据 JDBC 规范“如果批量更新中的某个命令未能正确执行,此方法会抛出一个 BatchUpdateException,并且 JDBC 驱动程序可能会或可能不会继续处理剩余的命令 在批处理中。”。这里并没有说之前执行的命令会被回滚。
我的理解错了吗?如果不是,为什么驱动程序会以这种方式行事,如果是,那么根据规范,正确的行为是什么。
【问题讨论】:
-
如果你使用自动提交,如果我没记错的话,所有批量插入仍然在一个事务中完成。将其视为编写插入多行的单个插入的不同方式 (
insert into .. values (..),(..),(..),(..)) -
感谢您的回复。但是规范呢。我认为这只是为了避免每次插入的网络往返,并且应用事务应该取决于应用程序。在数据库上,每个插入都应作为一个单元执行。作为用户,我可以在单个批次中添加不相关的插入以避免往返,如果某些命令失败,则不应回滚。
-
规范说“可能会或可能不会继续处理” - Postgres 选择不继续。
-
规范说“可能会或可能不会继续处理进一步的命令”我也找到了这个链接,但它太旧了,postgresql.org/message-id/…
-
那么“可能不继续”有什么不清楚的地方?
标签: java postgresql jdbc batch-updates