封锁机制

封锁机制
10.2.1 封锁及锁的类型
封锁机制是并发控制的主要手段。封锁是使事务对它要操做的数据有必定的控制能力。封锁具备3个环节:第一个环节是申请加锁,即事务在操做前要对它欲使用的数据提出加锁请求;第二个环节是得到锁,即当条件成熟时,系统容许事务对数据加锁,从而事务得到数据的控制权;第三个环节是释放锁,即完成操做后事务放弃数据的控制权。为了达到封锁的目的,在使用时事务应选择合适的锁,并要听从必定的封锁协议。数据库

基本的封锁类型有两种:排它锁(Exclusive Locks,简称X锁)和共享锁(Share Locks,简称S锁)。并发

(1)排它锁ide

排它锁也称为独占锁或写锁。一旦事务T对数据对象A加上排它锁(X锁),则只容许T读取和修改A,其余任何事务既不能读取和修改A,也不能再对A加任何类型的锁,直到T释放A上的锁为止。.net

(2)共享锁对象

共享锁又称读锁。若是事务T对数据对象A加上共享锁(S锁),其余事务对A只能再加S锁,不能加X锁,直到事务T释放A上的S锁为止。blog

10.2.2 封锁协议
简单地对数据加X锁和S锁并不能保证数据库的一致性。在对数据对象加锁时,还须要约定一些规则。例如,什么时候申请X锁或S锁、持锁时间、什么时候释放等。这些规则称为封锁协议(Locking Protocol)。对封锁方式规定不一样的规则,就造成了各类不一样的封锁协议。封锁协议分三级,各级封锁协议对并发操做带来的丢失修改、不可重复读取和读“脏”数据等不一致问题,能够在不一样程度上予以解决。索引

(1)一级封锁协议事务

一级封锁协议是:事务T在修改数据以前必须先对其加X锁,直到事务结束才释放。ip

根据该协议要求,将表10.1种的任务T一、T2做为事务,用A表示库存,从新执行各操做的过程见表过程见表10.4。get

表10.4 遵循一级封锁协议的事务执行过程封锁机制

可见,一级封锁协议可有效地防止“丢失更新”,并可以保证事务T的可恢复性。可是,因为一级封锁没有要求对读数据进行加锁,因此不能保证可重复读和不读“脏”数据。表10.5所示的操做过程听从一级封锁协议,但仍然发生了读“脏”数据错误。读者能够用相似的操做实例,便会发现一级封锁协议也不能避免不可重复读的错误。

表10.5 听从一级封锁协议发生的读“脏”数据过程

封锁机制

(2)二级封锁协议

二级封锁协议是:事务T对要修改数据必须先加X锁,直到事务结束才释放X锁;对要读取的数据必须先加S锁,读完后便可释放S锁。

二级封锁协议不但可以防止丢失修改,还可进一步防止读“脏”数据。可是因为二级封锁协议对数据读完后便可释放S锁,因此不能避免“不可重复读”错误。例如,表10.6所示的并发操做执行过程,听从二级封锁协议,但发生了“不可重复读”错误。

表10.6 听从二级封锁协议发生的“不可重复读”的过程

封锁机制

(3)三级封锁协议

三级封锁协议是事务T在读取数据以前必须先对其加S锁,在要修改数据以前必须先对其加X锁,直到事务结束后才释放全部锁。

因为三级封锁协议强调即便事务读完数据A以后也不释放S锁,从而使得别的事务没法更改数据A。三级封锁协议不但防止了丢失修改和不读“脏”数据,并且防止了不可重复读。

10.2.3 封锁出现的问题及解决方法
事务使用封锁机制后,会产生活锁、死锁等问题,DBMS必须妥善地解决这些问题,才能保障系统的正常运行。

1.活锁

若是事务T1封锁了数据R,T2事务又请求封锁R,因而T2等待。T3也请求封锁R,当T1释放了R上的封锁以后系统首先批准了T3的要求,T2仍然等待。而后T4又请求封锁R,当T3释放了R上的封锁以后系统又批准了T4的请求,……,T2有可能永远等待。这种在多个事务请求对同一数据封锁时,使某一用户老是处于等待的情况称为活锁。

解决活锁问题的方法是采用先来先服务。即对要求封锁数据的事务排队,使前面的事务先得到数据的封锁权。

2.死锁

若是事务T1和T2都须要数据Rl和R2,操做时Tl封锁了数据R1,T2封锁了数据R2;而后T1又请求封锁R2,T2又请求封锁Rl;因T2已封锁了R2,故T1等待T2释放R2上的锁。同理,因T1已封锁了R1,故T2等待T1释放R1上的锁。因为Tl和T2都没有得到所有须要的数据,因此它们不会结束,只能继续等待。这种多事务交错等待的僵持局面称为死锁。

数据库中解决死锁问题主要有两类方法:一类方法是采用必定措施来预防死锁的发生;另外一类方法是容许发生死锁,而后采用必定手段按期诊断系统中有无死锁,如有则解除之。

通常来说,死锁是不可避免的。DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。一般采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的全部的锁,使其余事务得以继续运行下去。固然,对撤消的事务所执行的数据修改操做必须加以恢复。

10.2.3 封锁的粒度
封锁粒度(Granularity)是指封锁对象的大小。封锁对象能够是逻辑单元,也能够是物理单元。以关系数据库为例,封锁对象能够是属性值、属性值的集合、元组、关系、直至整个数据库;也能够是一些物理单元,例如页(数据页或索引项)、块等。封锁粒度与系统的并发度和并发控制的开销密切相关。封锁的粒度越小,并发度越高,系统开销也越大;封锁的粒度越大,并发度越低,系统开销也越小。

一个系统应同时支持多种封锁粒度供不一样的事务选择,这种封锁方法称为多粒度封锁 (Multiple Granularity Locking)。选择封锁粒度时应该综合考虑封锁开销和并发度两个因素,选择适当的封锁粒度以求得最优的效果。一般,须要处理大量元组的事务能够以关系为封锁粒度;须要处理多个关系的大量元组的事务能够以数据库为封锁粒度;而对于一个处理少许元组的用户事务,以元组为封锁粒度比较合适。
转载于:https://blog.csdn.net/xijiaoda_liuhao/article/details/8444443

相关文章
相关标签/搜索