2.5 KiB
2.5 KiB
事务
事务分类
事务通常可分为如下类型:
- 扁平事务(flat transaction)
- 带保存点的扁平事务(flat transaction with savepoints)
- 链事务(chained transaction)
- 嵌套事务(nested transaction)
- 分布式事务(distributed transaction)
扁平事务
扁平事务为最常用的事务,在扁平事务中,所有操作都处于统一层次,其由begin work开始,并由commit work或rollback work结束。
扁平事务的操作是原子的,要么都提交,要么都回滚。
带有保存点的扁平事务
对于带有保存点的扁平事务,其支持在事务执行过程中回滚到同一事务中较早的一个状态。
在事务执行过程中,可能并不希望所有的操作都回滚,放弃所有操作的代价可能太大。通过保存点,可以记住事务当前的状态,在后续发生错误后,事务能够回到保存点当时的状态。
相较于扁平事务只能够全部回滚,带保存点的扁平事务能够回滚到保存点时的状态。
保存点可以通过save work来创建,使用示例如下所示
链事务
可视为保存点事务的一个变种。在使用带保存点的事务时,如果系统发生崩溃,那么所有的保存点都会消失。在后续重启进行恢复时,事务需要从开始处重新执行,而不是从最近的一个保存点开始执行。
若事务在数据库未提交时发生崩溃,那么在数据库再次重启执行recovery操作时,会对未提交的事务进行回滚,即使之前事务存在保存点,也会全部回滚
链事务的思想是,当提交事务时,释放不必要的数据对象,将必要的上下文隐式传递给下一个要开始的事务。提交事务和开始下一个事务操作必须为原子操作,下一个事务必须徐要能看到上一个事务的结果,示例如下:
和带保存点的扁平事务不同的是,带保存点的扁平事务能够回滚到任意正确的保存点,而链事务只能回滚当前事务。
且链事务和带保存点的扁平事务,对于锁的处理也不同:
链事务:对于每个事务,commit后释放持有的锁带保存点的扁平事务:在整个事务提交前,不会释放持有的锁