事务分类

一、扁平事务(Flat Transaction)

  扁平事务是事务类型中最简单的一种,但在实际生产环境中,这可能是使用最为频繁的事务。

  在扁平事务中,所有操作都是处于同一层次,其由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束,期间的操作是原子的,要么都执行,要么都回滚

  因此扁平事务时应用程序成为原子操作的基本组成模块。

  扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交

二、带有保存点的扁平事务(Flat Transactions with Savepoint)

  除了支持扁平事务支持的操作外,允许在事务执行过程中回滚到同一事务中较早的状态。这是因为某些事务可能在执行过程出现的错误并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销也太大。保存点(Savepoint)用来通知系统应该记住事务当前的状态,以便之后发生错误时,事务能回到保存点当时的状态。

  对于扁平事务来说,其隐式地设置了一个保存点。然而在整个事务中,只有这一个保存点,因此,回滚只能回滚到事务开始时的状态。保存点用SAVE WORK函数来建立,通知系统记录当前的处理状态。当出现问题时,保存点能用作内部的重启动点,根据应用逻辑,决定是回到最近一个保存点还是其他更早的保存点。

  如下图:

 

三、链事务(Chained Transaction)

  可视为保存点模式的一种变种。

  带有保存点的扁平事务,当系统发生崩溃时,所有的保存点都将消失,因此其保存点是易失的(volatile),而非持久的(persistent)。这就意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行。

  链事务的思想是:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务。

  注意,提交事务操作和开始下一个事务操作将合并为一个原子操作。这就意味着下一个事物将看到上一个事务的结果,就好像在一个事务中进行一样

  如图

  

  链事务与带有保存点的扁平事务不同的是

  1)带有保存点的扁平事务能回滚到任意正确的保存点。而链事务中的回滚只限于当前事务,即只能恢复到最近一个的保存点。

  2)链事务在执行COMMIT后即释放了当前事务所持有的锁,而带保存点的扁平事务不影响迄今为止所有的锁。

四、嵌套事务(Nested Transaction)

  是一个层次结构架构。由一个顶层事务(top-level transaction)控制着各个层次的事务。顶层事务之下嵌套的事务被称为子事务(subtransaction),其控制每个局部的变换。

  如图

  

  Moss对嵌套事务的定义:

  1)嵌套事务是由若干事务组成的一颗树,子树既可以是嵌套事务,也可以是扁平事务。

  2)处在叶节点的事务是扁平事务。但每个子事务从根到叶节点的距离可以是不同的。

  3)位于根节点的事务成为顶层事务,其他事务成为子事务。事务的前驱(predecessor)为父事务(parent),事务的下一层成为儿子事务(child)

  4)子事务既可以提交可以回滚,但是它的提交操作并不会马上生效,除非其父事务已经提交。因此,任何子事务都在顶层事务提交后才真正提交。

  5)树中的任意一个事务的回滚会引起其他的所有子事务一同回滚,故子事务仅保留A、C、I特性,不具备D的特性。

  Moss理论中,实际的工作是由叶子节点来完成的,即只有叶子节点的事务才能访问数据库,发送消息,获取其他类型的资源。而高层的事务仅负责逻辑控制,决定何时调用相关的子事务。即使一个系统不支持嵌套事务,可以通过保存点技术来模拟嵌套事务。如图

 

  用保存点技术来模拟嵌套事务在锁的持有方面还是嵌套事务有区别的

  当通过保存点技术时,用户无法选择哪些锁需要被子事务继承,哪些需要被父事务保留。也就是说,无论有多少个保存点,所有被锁住的对象都可以被得到和访问。

  嵌套事务例如:一个父事务p1,其持有对象X和Y的排它锁,现在要开始一个调用子事务p11,那么父事务p1可以不传递锁,也可以传递所有的锁,也可以只传递一个排它锁。如果子事务p11中还要持有对象Z的排它锁,那么通过反向继承(counter-inherited),父事务p1将持有3个对象X,Y,Z的排它锁。

五、分布式事务(Distributed Transactions)  

  通常是一个在分布式环境下运行的扁平事务,因此需要根据数据所在的位置访问网络中的不同节点。

  

  

  对于InnoDB存储引擎来说,其支持扁平事务,带有保存点的事务,链事务,分布式事务,而不支持嵌套事务不过可以通过带保存点的事务来模拟串行的嵌套事务

 

  参考资料:Mysql技术内幕

posted @ 2019-06-23 15:40  hyunbar  阅读(2133)  评论(0编辑  收藏  举报