一个事物的执行必须保持其原子性,既它所包含的所有更新操作要么全部都做,要么都不做。在分布式数据库系统中,一个全局是误会涉及多个场地上的数据更新,因此事务是分布式的,可以把一个事务看成要么一致地全部提交,要么一致的全部滚回。
在多用户系统中,还必须保证分布事务的可串行性。因此,分布事务管理主要包括两个方面:事务的恢复和并发控制。下面简要地讨论这两个问题。
1 分布事务的恢复
如同集中是数据库一样,在运行过程中分布是数据库同样会出现故障和错误,会造成数据库不同程度的损害,导致事务不能正常运行或导致数据库数据的不一致,或者会使部分或整个数据库遭到破坏。分布式数据库系统中,各个场地除了可能发生如同集中是数据库的那些故障外,还会出现通信网络中通信故障、时延、线路中断等事故,情况比集中是数据库更复杂,相应的恢复过程也就更复杂些。
为了执行分布事务,通常在每个场地都设立一个局部事务管理器,用来管理局步子事务的执行,保证子事务的完整性。同时,这些局部管理器之间还必须相互协调,保证所又场地对它们所处理的子事务采取同样的策略:要么都提交,要么都滚回。为了保证这一策略,最常用的技术式两段提交协议(简称2PC)。
两段提交协议把一个事物的事务管理分为两类:协调者;参与者。协调者负责作出该事务式提交还是撤销的最后决定。所有参与者负责管理相应子事务的执行及在各自局部数据库上执行写操作。
两段提交协议的内容是:
(1)第一阶段:协调者向所有参与者发出“准备提交”信息。如果某个参与者准备提交,就回答“就绪”信息,否则回答“撤销”信息。参与者在回答前,应把有关信息写入子集的日志中。协调者在发出准备提交信息前也要把有关信息写入自己的日之中。
如果在规定时间内协调者收到了所有参与者“就绪”的信息,则将做出提交的决定,否则将作出撤销的决定。
(2)第二阶段:协调者将有关决定的信息写入日志,然后把这个决定发送给所有参与者。所有参与者收到命令之后,首先往日志中写入“收到提交(或撤销)”决定的信息,并相协调者发送“应答”消息,最后执行有关规定。协调者收到所有参与者的应答消息后,一个事务的执行到此结束,有关日志信息可以脱机保存。
采用两段提交协议后,当系统发生故障时,各场地利用各自有关的日志信息可执行恢复操作,恢复操作的执行类似于集中式数据库。
可以看出,在两阶段提交协议中,各结点采取的是完全同步的方法,用以保证数据库的一致性。但从实际应用的角度来说,它的缺陷也是非常明显的,主要有:
(1)全局事务可靠性低。任何一个参与结点的失败或网络的中断都将导致整个事务的回滚。
(2)系统效率低下。由于采用完全同步的方法来保证数据库的一致性,系统的性能将取决于系统中最慢的结点。
为了解决紧密一致性的缺陷,相应地提出了松散一致性的概念:数据各副本的修改是异步的,也就是说各副本将不保证任何时刻数据库绝对的一致性;各副本同步的延迟时间可长可短,视系统的具体情况而定。与紧密一致性比较灵活,系统的可用性大为提高,适用于对数据一致性要求不高的应用,但对于银行转账这样的关键性应用,显然是不适合的。
2 并发控制
集中式数据库系统中并发控制一般采用封锁技术。
锁可分为不同类型,常用的是共享锁(Slock)、排它锁(Xlock)。封锁的对象可以是表一级的或记录一级的。
为了保证并发事务的可串行性,必须做到:
(1)遵守锁的相容性规则;
(2)遵守两段锁协议。
在分布式数据库系统中,并发控制也可采用封锁技术,不过与集中式数据库系统相比:分布式数据库系统由支持多副本的特点及由于事务的分布执行,封锁的方法可能会引起全局死锁着两个原因,使并法控制更为复杂。
如为了解决多副本问题,分布事务管理就要把“事务T1对d的X封锁”这件事让d副本所在场地上的事务管理器都知道,一个简单的方法是向这些事务管理器发出局部封锁请求,这个方法是有效的;但封锁的冗余度很大,局部封锁的数目和副本数相同。
为了减少系统开销,处理多副本的封锁可采取如下几种方法:
(1)对写操作,要申请对所有副本的X锁。对于读操作,只要申请对某个副本的S锁。
(2)无论是写操作还是读操作,都要对大多数(大于半数)副本申请X锁和S锁。
(3)规定某个场地上的副本为主副本,所有的读写操作均申请对主副本的封锁。
这三个方法均可有效地发现冲突,协调并发事务的执行。
基于封锁的并发控制方法在分布环境下还必须解决全局死锁问题。所谓全局死锁即包括两个以上场地上的死锁。
和集中式数据库系统相似,通常采用分布等待图来监测死锁。不同的是,分布情况下死锁检测涉及多个场地、多个局部数据库,需要较多的通信和验证,开销较大。
除了用死锁检测及结出方式来解决死锁问题外,还可以采用死锁预防方法,既不让死锁发生。典型的一种解决方法是对事务按某一标准进行排序,只允许它们沿着这一次序单向等待,这样就不会发生死锁了。
在分布式数据库中还研究基于时标(或称为时间戳)的方法和乐观方法等并发控制技术,但实际系统则大都是基于封锁的方法。