一、工作流事务
多数工作流过程都是一个长生存期的过程,在执行的过程中出现各种各样的故障和异常是很正常的,所以要引入事务处理机制。而仅仅满足ACID属性要求的经典事务模型无法有效的支持工作流系统中的事务处理。人们在传统事务模型的基础上提出了许多高级事务模型,希望能够将高级事务模型应用到长时间运行的分布式工作流管理中。
但是,许多高级事务模型的执行结构都很有限,大量的研究表明,无论工作流管理系统应用传统事务模型,或直接采用高级事务模型都是不可行的。已有的产品基本上很少应用高级事务模型,仅有少量的原型系统应用了高级事务模型,利用事务的特性对工作流进行管理。
二、事务模型
随着人们对事务问题研究的不断深入,现在事务模型主要有数据库系统中应用的经典事务模型和在其基础上提出的一些高级事务模型。这些模型都有各自的特点。
1、经典事务
所谓的经典事务一般是指在传统的关系数据库中应用的事务处理方法。它要求事务的ACID特性。实践证明,由于不同的特点,使得工作流系统不能完全照搬数据库事务处理的方法。数据库与工作流中的事务管理既有相同点,又有不同点。数据库中的事务和工作流系统中的事务都旨在保护数据的一致性,以及在错误和故障时,如何保证数据的可靠性。 但也有很多不同之处,例如:(1) 经典事务模型主要是针对数据库中的事务,以数据为中心构成了它的主要特点。这样的语义不能直接应用到工作流中。因为,工作流中的活动可能是事务性的,也可能具有非事务性。工作流中的事务和数据库或事务处理系统中的事务面向的对象不一样,相比而言,工作流中的事务面对的主要对象本身更具复杂性。(2) 组成数据库中的事务的操作一般执行时间都相对较短,但工作流中的事务活动通常执行时间长,涉及到很多对象,有复杂的控制逻辑。长活动作为单独的ACID事务执行会严重拖延其他高优先级的短事务的执行。(3)All-or-nothing对于工作流活动显得太严格而且代价很高。工作流事务需要避免这个问题,提供灵活的事务处理。(4) 在经典事务模型中,恢复单元是事务,每一个事务都有一个预先定义的语义集合,该集合与事务处理系统一致,工作流中的恢复模型更为复杂,恢复过程不仅要恢复工作流系统的状态,而且要使得过程能继续推进,保持与整个组织过程的一致。
如果我们将整个工作流过程看作一个经典事务,将会产生一系列的问题,例如:(1) 较长的持续时间增加了执行过程出现差错的可能性。一旦出现差错,根据原子性的要求,在此之前所做的大量工作都会丢失。(2) 隔离性要求使得不同的事务之间不能进行消息或者控制的交换,然而对于工作流中的协同活动而言,在不同的事务之间存在这样或者那样的依赖关系是很正常的现象;(3) 此外加锁的并发控制机制极大地降低了长事务的吞吐率,而且限制了不同用户之间实时的数据交换,使得协作丧失了基础。(4) 对于协作流程特别是同步协作,用户需要感知到对方的存在,但在传统的数据库应用中,用户独自使用数据库,感觉不到其他用户的存在。
2、高级事务
由于前面提到的原因,所以人们开始对工作流事务处理方面进行深入研究。一个工作流的执行,一般来说都要花费很长的时间,并且很多情况下,都需要人工干预才能完成。例如,在商品的订购与发售这样的流程上消耗的时间更加不可预测。所谓长事务(Long-living Transaction)是需要长时间运行的事务,如果我们将长事务作为一个原子事务来处理,就会使系统性能变差,而且长事务的原子性可能会让系统长期占用资源,同时增加了事务取消和死锁的概率。为了解决这些问题,人们以经典事务为基础,又提出了许多高级事务模型。
a) 嵌套事务
它是事务模型演变过程中的重要一步,它将传统的单层(flat) 事务扩展为多层结构. 在子事务出现差错的情况下,父事务可以选择自己的恢复措施, 因此原子性的要求降低了. 但是子事务的结果只有它的所有父事务成功提交之后才对外可见,因此隔离性并没有降低.
b) Sagas
Saga模型的解决方案:如果将长事务分成一系列的小事务,每个小事务都有自己的ACID属性,则这个长事务就叫做saga事务。当所有的小事务都进行了提交后,整个saga事务才算提交。假如saga事务执行了一部分小事务就取消了,那么必须对已经提交了小事务进行补偿。
Saga模型的基本原理:假设Saga事务为Ts,将Ts分解成一系列小事务T1,T2,T3…Tn,每一个小事务对应着一个补偿事务C1,C2,C3…Cn。系统有两种执行路线,一是顺序执行了T1,T2,T3….Tn后,这时Ts提交。二是顺序执行T1,T2,T3…Ti,Ci,Ci-1,…C3,C2,C1后取消,这时Ts取消。
Saga模型放松了对事务操作的分离性的要求,增加了事务间的并发性。
c) ACTA
ACTA是一个事务框架,利用一阶逻辑刻画事务的属性,允许用户对事务模型的属性进行推理。它提供了一系列的构造模块,例如历史、事务间的依赖、事务视图、冲突集合以及委托,供用户指定自己所需要的事务属性,因此对原子性和隔离性的要求可以很容易满足。ACTA没有提供访问控制,可扩展性也没有涉及。另外,定义一个事务使之具有某些属性并且确保执行历史遵循这些特性是比较困难的,这也限制了其应用领域。
d) 柔性事务模型
柔性事务模型是专门为多数据库环境的应用而提出的。柔性事务模型中引入了等价事务的概念,在主事务失败的时候,它通过执行相应的等价事务以期达到同样的效果;它允许设计者指定事务的可接受状态,因此原子性的要求降低了。另外对补偿事务的支持降低了隔离性要求。
e) 协同活动模型
协同活动模型提供了适于协同场景的事务属性,它放松了对传统事务原子性和隔离性的要求。它提供了简单的访问控制,每个用户工作在自己的私有空间,同其他用户之间的数据交换受到一定的约束。用户可以方便地加入/退出系统,因此可扩展性较好。这是能够看到的覆盖很大应用领域的事务模型之一。在该模型的四种目标应用场景(即协同写作、工业设计、软件工程和工作流)中,只实现了协同写作应用的原型。
f) 双层事务模型
双层事务模型已经在WIDE项目实现。它将一个流程作为一个全局事务,认为一个全局事务由一系列的本地事务组成,这些本地事务是严格遵守ACID特性的原子事务。并给出与这个流程相对应的一个全局事务定义图。这个流程实例的运行,将产生全局事务执行图。它将根据这个全局事务执行图来生成事务补偿图。同时,给出了事务补偿机制的形式化描述;提出动态加入安全点,达到减小局部补偿的影响范围。在WIDE项目中,不但存在一个工作流引擎,而且存在一个事务管理引擎。这个事务管理引擎是作为一个CORBA组件出现的。
摘自抽刀断水