如果我们在事务执行期间终止JVM进程会发生什么?

时间:2015-08-11 19:46:40

标签: java postgresql jdbc

我正在使用PostgreSQL 9.4。

当批处理中的某些查询已经执行时,如果有人在执行事务批量更新(批量大小= 50)期间杀死JVM进程会发生什么?

数据库中会包含什么内容?

2 个答案:

答案 0 :(得分:7)

预期的行为是未提交的事务,在数据库端超时并回滚。提交的事务已经提交。

整合各种评论的答案:

  

如果某些人已经实际执行但其他人没有执行,那么这不是一批。在事务批处理中,要么所有这些都在现实中执行,要么都不执行。 - 彼得劳里

另一个

  

试着想象一下:1- jvm开始交易; 2-数据库做这个过程; 3 - 如果你杀了JVM,jvm会将提交发送到end transaction而不管数据库中发生什么事情都不会运行提交因此它会回滚 - Jorge Campos

最后,对于PostgreSQL

  

数据库中会包含什么内容? - >一切,只有成功的承诺。其他一切都不会成功。 (如果您的“批处理”进程不使用事务,那么您的数据库可能处于不一致状态 - 至少从业务角度来看,因为从严格的数据角度来看,PostgreSQL作为一个不错的ACID RDBMS,能够保证持久性[又名提交/插入的内容仍然被提交/插入]。) - acdcjunior

答案 1 :(得分:6)

连接有两种情况:自动提交模式或自动提交模式(通过调用Connection#setAutoCommit(false))。

在第一种情况下,当执行一批更新SQL命令时,可能会部分执行命令,即某些命令可能被提交而其他命令仍未执行。请参阅Statement#executeBatch()的文档中的引用:

  

如果批量更新中的某个命令无法正确执行,则此方法将抛出BatchUpdateException,并且JDBC驱动程序可能会也可能不会继续处理批处理中的其余命令。但是,驱动程序的行为必须与特定的DBMS保持一致,要么始终继续处理命令,要么永远不会继续处理命令。

当连接未处于自动提交模式时,仅当返回对Connection#commit的调用时,我们才能假定所有提交的命令都已提交。在此次通话后,全部或全部都未提交。