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