【问题标题】:What happens if we kill the JVM process during transaction execution?如果我们在事务执行期间杀死 JVM 进程会发生什么?
【发布时间】:2015-11-04 04:49:45
【问题描述】:

我使用的是 PostgreSQL 9.4。

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

数据库中会有什么?

【问题讨论】:

  • 是的,会发生什么? - 预期行为是未提交的事务在数据库端超时并回滚。已提交的事务是已提交的。
  • What will be in the database? -> 一切,只有成功提交的内容。其他一切都不会成功。 (如果您的“批处理”过程不使用事务,那么您的数据库可能会处于不一致状态 - 至少从业务角度来看,因为从严格的数据角度来看,PostgreSQL 作为一个不错的 ACID RDMS,能够保证持久性[又名提交/插入的内容仍然提交/插入])。
  • 如果有一些已经实际执行,但其他没有,那么它不是一个批次。在事务批处理中,要么全部在现实中执行,要么都不执行。
  • 试着想象一下: 1- jvm 启动事务; 2-数据库做的过程; 3 - 如果你杀死 JVM,jvm 发送提交以结束事务,无论数据库中发生什么,它都不会运行提交,因此它将回滚
  • @PeterLawrey JDBC 没有指定批处理执行应如何使用 autoCommit=true,并将其留给各个数据库和驱动程序实现。一些驱动程序将(准备好的语句)批次重写为单个语句,其他数据库具有允许它们发送一批参数以执行的 API,并且仅在之后提交,等等。因此,自动提交的提交点可能因实现而异(以及实现中的批量大小),因此如果您考虑 autoCommit=true,那么您之前关于事务性的评论太简单了

标签: java postgresql jdbc


【解决方案1】:

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

整合来自各种 cmets 的答案:

如果有些已经实际执行,但有些没有,那么它不是一个批次。在事务批处理中,它们要么全部在现实中执行,要么都没有。 ——彼得劳里

另一个

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

最后,对于 PostgreSQL

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

【讨论】:

  • 我会为这个答案向所有贡献者投票。谢谢大家
【解决方案2】:

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

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

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

当连接不处于自动提交模式时,只有当返回对Connection#commit 的调用时,我们才能假设所有提交的命令都已提交。在此调用之后,要么全部提交,要么都不提交。

【讨论】:

  • 注意:如果你使用自动提交模式,你已经关闭了批处理。
  • @PeterLawrey 你不能解释一下原因吗?
  • @St.Antario 根据定义批量处理一系列操作/消息/任务。当你提交时,你说这是批处理的结束。通过自动提交,您将批量大小设为 1。
  • @PeterLawrey autoCommit=true 下的确切行为取决于驱动程序。一些驱动程序将整个批次作为一个事务执行,而其他驱动程序将批次中的各个项目作为单独的事务执行。
猜你喜欢
  • 2019-04-07
  • 2019-08-10
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多