首页 理论教育数据库技术与应用教程:封锁协议的规则和效果

数据库技术与应用教程:封锁协议的规则和效果

【摘要】:称这些规则为封锁协议或加锁协议。如图7-9所示为使用二级封锁协议防止读“脏”数据的情况。三级封锁协议除了可以防止丢失修改和不读“脏”数据之外,还进一步防止了不可重复读。图7—10三个封锁协议下可重复读在图7-10中,事务T1要读取A、B的值,因此先对A、B加S锁,这样其他事务只能再对A、B加S锁,而不能加X锁,即其他事务只能对A、B进行读取操作,而不能进行修改操作。表7—2不同级别的封锁协议

在运用X锁和S锁给数据对象加锁时,还需要约定一些规则,例如,何时申请X锁或S锁、持锁时间、何时释放锁等。称这些规则为封锁协议或加锁协议。对封锁方式制定不同的规则,就形成了各种不同级别的封锁协议。不同级别的封锁协议所能达到的系统一致性级别是不同的。

1.一级封锁协议

一级封锁协议:对事务T要修改的数据加X锁,直到事务结束(包括正常结束和非正常结束)时才释放。

一级封锁协议可以防止丢失修改,并保证事务T是可恢复的,如图7-8所示。在图7-8中,事务T1要对A进行修改,因此,它在读A之前先对A加了X锁;当T2要对A进行修改时,它也申请对A加X锁,但由于A已经被加了X锁,因此T2申请对A加X锁的请求被拒绝,T2只能等待,直到T1释放了对A加的X锁为止。当T2能够读取A时,它所得到的已经是T1更改后的值了。因此,一级封锁协议可以防止丢失修改。

图7—8 没有丢失修改

在一级封锁协议中,如果事务丁只是读数据而不对其进行修改,则无须加锁。因此,不能保证可重复读和不读“脏”数据。

2.二级封锁协议

二级封锁协议:一级封锁协议加上事务T对要读取的数据加S锁,读完后即释放S锁。

二级封锁协议除了可以防止丢失修改外,还可以防止读“脏”数据。如图7-9所示为使用二级封锁协议防止读“脏”数据的情况。

在图7-9中,事务T1要对B进行修改,因此,先对B加了X锁,修改完后将值写回数据库。这时T2要读B的值,因此,申请对B加S锁,由于T1已在B上加了X锁,因此T2只能等待。当T1由于某种原因撤销了它所做的操作时,B恢复为原来的值50,然后T1释放对B加的X锁,因而T2获得了对B的S锁。当T2能够读B时,B的值仍然是原来的值,即T2读到的是50。因此避免了读“脏”数据。

(www.chuimin.cn)

图7—9 二级封锁协议下不读“脏”数据

在二级封锁协议中,由于事务T读完数据即释放S锁,因此,不能保证可重复读数据。

3.三级封锁协议

三级封锁协议:一级封锁协议加上事务T对要读取的数据加S锁,并直到事务结束才释放。

三级封锁协议除了可以防止丢失修改和不读“脏”数据之外,还进一步防止了不可重复读。如图7-10所示为使用三级封锁协议防止不可重复读的情况。

图7—10 三个封锁协议下可重复读

在图7-10中,事务T1要读取A、B的值,因此先对A、B加S锁,这样其他事务只能再对A、B加S锁,而不能加X锁,即其他事务只能对A、B进行读取操作,而不能进行修改操作。因此,当T2为修改B而申请对B加X锁时被拒绝,T2只能等待。T1为验算再读A、B的值,这时读出的值仍然是A、B原来的值,因此求和的结果也不会变,即可重复读。直到T1释放了在A、B上加的锁,T2才能获得对B的X锁。

三个封锁协议的主要区别在于读操作是否需要申请封锁,以及何时释放锁。三个级别的封锁协议的总结如表7-2所示。

表7—2 不同级别的封锁协议