δα0δβ1δβ2δα3δβ4δα5δα6δγ7……
δβ δα
数据δ被活动α、β、γ共修改八次,活动α修改的序列为δα0、δα3、δα5、δα6,则α最后修改有效值δα为δα6。类似,活动β最后修改有效值为δβ4。
域内隔离属性包括Iα和Iβ,Iα包含三种隔离级别,分别是未提交,提交和线性:①未提交: ∀α∈Aρ,如果α活动访问数据δ,δ∈Δρ,可以访问δαi; ②提交: ∀α∈Aρ,如果α活动访问数据δ,δ∈Δρ,可以访问δα; ③线性:域内的活动串行地访问共享数据δ。
Iβ用来协调相同事务实例的并发,它包含三种隔离级别,分别是后入先出,先入先出,串行。InsiT表示事务T的第i个实例。假设事务T有两个实例Ins1T和Ins2T,Ins1T先执行,则:①后入先出:Ins2T可以在Ins1T运行过程中开始,并可以先于Ins1T结束;②先入先出:Ins2T可以在Ins1T运行过程中开始,但必须在Ins1T 结束后结束;③串行:Ins2T必须在Ins1T结束后才可以开始,即各实例之间串行执行[8]。
定义3 域外隔离属性[8] 指控制隔离域外活动访问域内的共享数据的机制。
(1)原子一致性:∀α∈Δρ,如果活动α修改数据δ,α∈Aρ,任意δαi对域外都可见;
(2)选择一致性:∀α∈Δρ,如果活动α修改数据δ,α∈Aρ,只有对域外可见;
(3)完全一致性:∀α∈Δρ,如果活动α修改数据δ,α∈Aρ,只有对域外可见,并且是该域中的最后值,且该域必须已经全部执行完毕。 域管理器 根据隔离域和隔离属性的定义,域管理器负责维护活动所属的隔离域。隔离域在执行过程中包括四种状态:就绪、修改、提交、完成。就绪指该域还没有活动执行;修改指该域中的活动正在访问共享数据;提交指该域中部分活动已经完成,但域中还有未完成的活动;完成指该域中所有活动执行完毕。系统在运行过程中,根据域的状态来判断是否有权限对所要访问的资源进行操作,在运行过程中的活动严格遵守表1中的访问规则。
表1 隔离域访问权限[8]
根据WS-C规定,初始化事务时分配一个对应的协调器,同时,根据事务中活动的操作语义划分隔离域并设置相应的隔离级别。在隔离域划分过程中,首先建立一张共享资源表,记录域中所要访问的共享资源。该共享资源表动态建立与扩展,即事务执行时,将该事务中的所有共享资源填入表中。同一个事务的多个实例,只有第一个实例运行时才将其共享资源列入表中,同一个事务的多个实例拥有独立的隔离域。
事务执行过程中,活动在访问共享资源前首先检查所属隔离域的状态,满足条件时才能操作,否则等待。如果隔离域中的活动已全部完成,则删除隔离域。
2.3 并发控制算法
初始化一个事务实例时,首先根据事务操作语义划分隔离域,并将要访问的共享资源添加到共享资源表中,然后执行事务实例。隔离域可以包含一个或者多个共享资源。协调器与参与者之间以消息驱动,用消息协调执行过程。算法1给出了协调器如何根据隔离域的不同状态完成事务的并发控制的流程。在协调器向活动发送complete消息时,活动的域管理器首先检测该隔离域的状态,并查看所属隔离域的Iα,根据表1中的属性,查看是否满足访问权限,同时检查该事务所有实例的隔离域的状态,并查看Iβ的属性,看是否满足访问权限,同时检查访问同一共享数据的其它隔离域的状态,并查看其域外隔离级别Iγ,如果三者都允许访问,执行该活动,所属隔离域状态变为“修改”,并向其协调器发送completed消息,否则发送wait消息,进入等待状态。当隔离域状态改变时,域管理器会通知响应的协调器唤醒等待的事务。事务进入completed状态后,当事务收到协调器的close消息时,事务开始提交,该活动执行结束后,隔离域状态变为“提交”,检测该隔离域内是否还有未执行的活动,若有,则该活动将隔离域状态更改为“修改”,继续执行隔离域内的剩余活动。事务向其协调器发送closed消息时,事务执行完成,隔离域状态由“提交”变成“完成”。算法2具体描述了事务的提交机制,算法1中调用了算法2。
在算法2中,当事务没有访问权限时,事务状态变为“等待”,直到满足条件后,由其所属协调器唤醒该事务。多个等待的事务存在依赖关系可能形成死锁。假设事务T1里包含服务W1和W6,事务T2里面包含服务W2和W3,事务T3包含W4和W5,图4描述了活动所属的隔离域,ISi为隔离域,T1依赖于T2,T2依赖于T3,T3依赖于T1, IS1协调WS1和WS2,IS2协调WS3和WS4,IS3协调WS5和WS6,C1、C2、C3分别为WS1、WS2、WS3的协调器。事务的活动顺序执行,当WS2、WS4、WS6分别把所属隔离域IS1、IS2 和IS3访问状态变为“不允许”,事务执行到WS1、WS3、WS5时将进入等待状态,形成死锁。
图4 并发事务依赖关系
并发事务的协调器相互通信能完成死锁检测,但效率不高。当事务进入等待状态时,由等待事务调用死锁检测的方法。算法2在事务处于等待时调用算法3完成冲突检测。算法3中描述的机制,只在事务等待时由等待事务发送令牌,令牌只发送给同时等待同一共享资源的事务,依据令牌是否回到原点检测是否存在死锁。一旦检测出死锁,发起死锁检测的事务可通过改变竞争事务的状态消除死锁。以上述事务死锁为例,假设由事务T1发起死锁检测,T3作为令牌回到的T1前的最后一个事务,T3的协调器向其发送补偿消息,则T1、T2可顺利提交。当事务隔离域状态改变时,由该事务的协调器隔离域唤醒等待该共享资源的事务。
算法2改进了WS-C和WS-Tx,在扩展后的事务状态转换图增加了“wait”状态,图5为对图2扩展后的状态转换图。
图5 扩展后的状态转换图