Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果在事务执行期间终止JVM进程会发生什么?_Java_Postgresql_Jdbc - Fatal编程技术网

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

Java 如果在事务执行期间终止JVM进程会发生什么?,java,postgresql,jdbc,Java,Postgresql,Jdbc,我正在使用PostgreSQL 9.4 如果有人在执行事务性批处理更新(批处理大小=50)期间杀死JVM进程,而批处理中的某些查询已经执行,会发生什么情况 数据库中会有什么?连接可以有两种情况:要么处于自动提交模式,要么不处于自动提交模式(通过调用连接#setAutoCommit(false)) 在第一种情况下,当执行一批更新SQL命令时,可能会部分执行命令,即某些命令可能已提交,而其他命令仍未执行。请参阅以下文件中的此引用: 如果批处理更新中的某个命令无法正确执行,此方法将抛出BatchUpd

我正在使用PostgreSQL 9.4

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


数据库中会有什么?

连接可以有两种情况:要么处于自动提交模式,要么不处于自动提交模式(通过调用
连接#setAutoCommit(false)

在第一种情况下,当执行一批更新SQL命令时,可能会部分执行命令,即某些命令可能已提交,而其他命令仍未执行。请参阅以下文件中的此引用:

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


当连接未处于自动提交模式时,只有在返回对
connection\commit
的调用时,我们才能假定所有提交的命令都已提交。此调用后,要么提交全部事务,要么不提交任何事务。

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

综合各种评论的答案:


如果一些已经实际执行,但其他没有执行,那么它不是批处理。在事务性批处理中,要么全部执行,要么一个也不执行彼得·劳瑞

另一个


试着想象一下:1-jvm启动事务;2-数据库做流程;3-jvm发送提交到结束事务如果您杀死jvm,不管数据库中发生什么,它都不会运行提交,因此它将回滚–Jorge Campos

最后,对于PostgreSQL

数据库中将包含哪些内容?->所有的事情,只有成功的承诺。其他一切都不行。(如果您的“批处理”流程不使用事务,那么您的数据库可能会处于不一致的状态——至少从业务角度来看是这样,因为从严格的数据角度来看,PostgreSQL作为一种体面的ACID RDBMS,能够保证持久性[即提交/插入的内容仍然是提交/插入的])–acdcjunior


是的,发生了什么预期的行为是未提交的事务在数据库端超时并回滚。提交的事务是已提交的。
数据库中将包含哪些内容?
->所有内容以及仅成功提交的内容。其他一切都不行。(如果您的“批处理”流程不使用事务,那么您的数据库可能会处于不一致的状态——至少从业务角度来看是这样,因为从严格的数据角度来看,PostgreSQL作为一种体面的ACID RDMS,能够保证持久性[即提交/插入的内容仍然是提交/插入的]).如果有些人实际执行了,但其他人没有,那么这不是一批。在事务性批处理中,要么全部执行,要么一个都不执行;2-数据库做流程;3-jvm发送提交到结束事务如果您杀死jvm,不管数据库中发生了什么,它都不会运行提交,因此它会rollback@PeterLawreyJDBC没有指定在autoCommit=true时批处理执行应该如何工作,而是将其留给各个数据库和驱动程序实现。一些驱动程序将(准备好的语句)批重写为单个语句,其他数据库有API,允许它们发送一批参数以供执行,并仅在执行后提交,等等。因此,自动提交的提交点可能因实现而异(以及实现内的批大小),所以,如果你考虑自动提交= TtrueNoT,你对事务性的早期评论过于简单化:如果你使用自动提交模式,你就已经关闭了批处理。@彼得劳瑞不能解释为什么吗?@ S.Atdio一批定义了一系列的操作/消息/任务。当您提交时,您说这是批处理的结束。通过自动提交,您将使批大小变为1。@PeterLawrey在autoCommit=true下的确切行为取决于驱动程序。一些驱动程序将整个批处理作为一个事务执行,而另一些驱动程序将批处理的各个项目作为单独的事务执行。我将为这个答案向所有贡献者分配投票。谢谢各位