数据库事务的学习02

1、排他锁、共享锁
排他锁:
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加上任何其他类型的锁,直到T释放A上的锁为止。

共享锁:
若事务T对数据对象A加上了S锁,则事务T可以读A但不能修改A,其他事务只能对A加上S锁,而不能加入X锁。
2、封锁类型的相容矩阵
T1 \\\ T2 X S -
X N N Y
S N Y Y
- Y Y Y
Y=YES 相容的请求
N=NO 不相容的请求

X:排他锁
S:共享所
-:表示不加锁

例子:
T1对对象A加了X锁,那么T2对对象A的加X,S锁的请求被拒绝,不加锁的请求被允许
注意:如果请求是 修改/读取对象A但是不对其加锁的请求,是被允许的,这样锁就没有意义了,所以要搭配封锁协议来使用
如下面的书页P311中的例子c:
事务T1在修改数据C,第二个时间点T2事务去查询数据C,书上说如果读的时候不加S锁会产生脏读。
说明不加锁可以读到数据而不用等待。
同理:不加锁的去请求修改也可以的。
3、封锁协议
一、一级封锁协议
一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。使用一级封锁协议可以解决丢失修改问题。
在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,它不能保证可重复读和不读“脏”数据。
二、二级封锁协议
二级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁。
二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
三、三级封锁协议
三级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读
上述三级协议的主要区别在于什么操作需要申请封锁,以及何时释放。

原文地址:https://www.cnblogs.com/dxwen/p/11197340.html