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

St.*_*rio 8 java postgresql jdbc

我正在使用PostgreSQL 9.4.

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

数据库中会有什么?

blu*_*fus 7

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

整合各种评论的答案:

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

另一个

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

最后,对于PostgreSQL

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


man*_*uti 6

有两种情况可以是连接:在自动提交模式下或不在自动提交模式下(通过调用Connection#setAutoCommit(false)).

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

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

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

  • 注意:如果您使用自动提交模式,则已关闭批处理. (3认同)