数据库—封锁技术
来源:互联网 发布:python jenkins api 编辑:程序博客网 时间:2024/06/07 21:18
一、封锁
什么是封锁:封锁是指事务在对某个数据对象操作之前,先向系统发出请求,对其加锁。加锁之后,事务就对该数据对象有了一定的控制,在事务释放锁之前,其他事务不能对此数据对象进行更新。封锁是实现并发控制的一个非常重要的技术。
二、基本的封锁类型
排它锁(Exclusive Locks,简记为X锁)又称为写锁;
共享锁(Share Locks,简记为S锁)又称为读锁;
排它锁:
若事务T对数据对象加上X锁,则只允许事务T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放锁。
共享锁:
若事务T 对数据对象A加上S锁,则事务T可以读A但不能修改A ,其它事务只能再对A 加S 锁,而不能加X锁,直到T释放A上的S锁。
三、锁的相容矩阵
Y指相容的请求,N指不相容的请求,上图的意思是,比如事务T1给某对象加上了X锁,则事务T2不可以再给对象家X锁和S锁,但可以不加锁对数据进行操作;事务T1若给对象加了S锁,则事务T2不可以给对象加X锁,但可以给对象加S锁,也可以不加锁操作数据;事务T1若不给对象加锁,则事务T2可以给对象加X锁、S锁,也可以不加锁。
三、三级封锁协议
在运用X锁和S锁对数据对象加锁时,需要遵循封锁协议。各种不同的封锁协议,在不同程度上保证了并发操作的正确调度。
1.一级封锁协议
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。(结束包括正常结束Commit和非正常结束Rollback)
事务并发可以带来三类问题:1.丢失更新;2.不可重复读;3.读“脏”数据
一级封锁协议可以防止丢失更新,但如果事务T1仅仅读数据,不进行修改,是不需要加锁的,所以一级封锁协议不可以防止不可重复读和读“脏”数据这两类并发问题。
2.二级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。(此处的S锁为短锁,仅持续到读完数据)
二级封锁协议可以防止丢失修改和读“脏”数据,但由于读完数据后即可释放S锁,仍不可以防止不可重复读这一并发问题。
3.三级封锁协议
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。(此处的S锁为长锁,持续到事务结束)
三级封锁协议可防止丢失修改、读脏数据和不可重复读。