【发布时间】: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