资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,第十一章 数据库并发控制,授课教师:王晓鹏,在多用户和网络环境下,数据库是一个共享资源,,多个用户或应用程序同时对数据库的同一数据对象进行读写操作,这种现象称为对数据库的并发操作。,显然并发操作可以充分利用系统资源,提高系统效率。,虽然如此,但是如果对并发操作不进行控制会造成一些错误。,飞机定票数据库系统,银行数据库系统,特点:在同一时刻并发运行的事务数可达数百个;,对并发操作进行的控制称为并发控制。,并发控制机制是衡量一个,DBMS,的重要性能指标之一。,数据库的并发控制以事务为单位,通常使用封锁技术实现并发控制。对数据对象施加封锁,会带来活锁和死锁问题,并发控制机制必须提供适合数据库特点的解决方法。,本次课内容,第一部分,并发控制概述,封锁机制,活锁和死锁,一、并发控制概述,事务的,ACID,特性可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的。为保证事务的隔离性和数据库的一致性,,DBMS,必须提供并发控制机制;,并发控制机制的任务,对并发操作进行正确调度,保证事务的隔离性,保证数据库的一致性,1,、不同的多事务执行方式,(1),事务串行执行,每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行;,不能充分利用系统资源,发挥数据库共享资源的特点;,(2),交叉并发方式(,Interleaved Concurrency,),在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉运行;,单处理机系统中的并行事务并没有真正地并行运行,但能够减少处理机的空闲时间,提高系统的效率;,T1,T2,T3,事务的串行执行方式,事务的交叉并发执行方式,(3),同时并发方式,(,simultaneous concurrency,),多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行;,最理想的并发方式,但受制于硬件环境;,本章讨论的并发控制技术以单处理机系统为基础;,事务并发执行带来的问题:,会产生多个事务同时存取同一数据的情况;,若对并发操作不加控制,就可能会存取和存储不正确的数据,破坏事务一致性和数据库的一致性;,2,、并发操作可能产生的问题,并发操作不加以限制,会产生数据不一致性问题,这种问题共有三类:,1,)丢失修改(,Lost Update,),例,1,:假设某产品库存量为,50,,现在购入该产品,100,个,执行入库操作,库存量加,100,;用掉,40,个,执行出库操作,库存量减,40,;分别用,T1,和,T2,表示入库和出库操作任务。,若同时发生入库(,T1,)和出库(,T2,)操作,这就形成并发操作。,T1,读取库存后,,T2,也读取了同一个库存;,T1,修改库存,回写更新后的值;,T2,修改库存,也回写更新后的值。,此时库存为,T2,回写的值,,T1,对库存的修改丢失。,如表所示,,T1,和,T2,的并发操作执行发生了“丢失修改”错误。,发生丢失修改的过程,顺序,任务,操作,库存量,1,T1,读库存量,50,2,T2,读库存量,50,3,T1,库存量,=50+100,4,T2,库存量,=50-40,5,T1,写库存量,150,6,T2,写库存量,10,例,2,:飞机订票系统中的一个活动序列;,甲售票点,(,甲事务,),读出某航班的机票余额,A,,设,A=16,;,乙售票点,(,乙事务,),读出同一航班的机票余额,A,,也为,16,;,甲售票点卖出一张机票,修改余额,AA-1,,所以,A,为,15,乙售票点也卖出一张机票,修改余额,AA-1,,所以,A,为,15,,把,A,写回数据库,结果明明卖出两张机票,数据库中机票余额只减少,1,;,2,)读“脏数据”(,dirty read,),当,T1,和,T2,并发执行时,在,T1,对数据库更新的结果没有提交之前,,T2,使用了,T1,的结果,而在,T2,操作之后,T1,又回滚,这时引起的错误是,T2,读取了,T1,的“脏数据”。,发生读“脏数据”的过程,顺序,任务,操作,库存量,1,T1,读库存量,50,2,T1,库存量,=50+100,3,T1,写库存量,150,4,T2,读库存量,150,5,T2,库存量,=150-40,6,T1,ROLLBACK,3,)不可重复读(,Non-repeatable Read,),当,T1,读取数据,A,后,,T2,执行了对,A,的更新,当,T1,再次读取数据,A,(希望与第一次是相同的值)时,得到的数据与前一次不同,这时引起的错误称为,“,不可重复读,”,。,发生“不可重复读”的过程,顺序,任务,操作,库存量,A,入库量,B,1,T1,读,A=50,50,100,2,T1,读,B=100,3,T1,求和,=50+100,4,T2,读,B=100,50,5,T2,执行,B=B*4,6,T2,回写,B=400,50,400,7,T1,读,A=50,50,8,T1,读,B=400,400,9,T1,求和,=450,(验算不对),三类不可重复读:,事务,1,读取某一数据后:,1.,事务,2,对其做了修改,,,当事务,1,再次读该数据时,得到与前一次不同的值。,2.,事务,2,删除了其中部分记录,,,当事务,1,再次读取数据时,发现某些记录神密地消失了。,3.,事务,2,插入了一些记录,,,当事务,1,再次按相同条件读取数据时,发现多了一些记录。,后两种不可重复读有时也称为,幻影现象,(,phantom row,),并发操作之所以产生错误,是因为任务执行期间相互干扰造成的。当将任务定义成事务,事务具有的特性(特别是隔离性)得以保证时,就会避免上述错误的发生。,但是,如果只允许事务串行操作会降低系统的效率。所以,多数,DBMS,采用事务机制和封锁机制进行并发控制,既保证了数据的一致性,又保障了系统效率。,二、,封锁机制,封锁机制是并发控制的主要手段;,封锁就是事务,T,在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁;,加锁后事务,T,就对该数据对象有了一定的控制,在事务,T,释放它的锁之前,其它的事务不能更新此数据对象。,封锁具有,3,个环节:,第一个环节是申请加锁;,第二个环节是获得锁;,第三个环节是释放锁。,为了达到封锁的目的,在使用时事务应选择合适的锁,并要遵从一定的封锁协议。,基本的封锁类型有两种:排它锁,(Exclusive Locks,,简称,X,锁,),和共享锁,(Share Locks,,简称,S,锁,),。,排它锁(,X,锁,),排它锁也称为独占锁或写锁。一旦事务,T,对数据对象,A,加上排它锁,(X,锁,),,则只允许,T,读取和修改,A,,其他任何事务既不能读取和修改,A,,也不能再对,A,加任何类型的锁,直到,T,释放,A,上的锁为止。,共享锁(,S,锁),共享锁又称读锁。如果事务,T,对数据对象,A,加上共享锁,(S,锁,),,事务,T,对数据对象,A,只能读不能修改,其他事务对,A,只能再加,S,锁,不能加,X,锁,直到事务,T,释放,A,上的,S,锁为止。,锁的相容矩阵,Y=Yes,,相容的请求,N=No,,不相容的请求,T,2,T,1,X,S,-,X,N,N,Y,S,N,Y,Y,-,Y,Y,Y,使用封锁机制解决丢失修改问题(,P,296,),T,1,T,2,Xlock,A,R(A)=16,Xlock,A,AA-1,等待,W(A)=15,等待,Commit,等待,Unlock A,等待,获得,Xlock,A,R(A)=15,AA-1,W(A)=14,Commit,Unlock A,事务,T1,在读,A,进行修改之前先对,A,加,X,锁;,当,T2,再请求对,A,加,X,锁时被拒绝;,T2,只能等待,T1,释放,A,上的锁后,T2,获得对,A,的,X,锁,这时,T2,读到的,A,已经是,T1,更新过的值,15,;,T2,按此新的,A,值进行运算,并将结果值,A=14,送回到磁盘。避免了丢失,T1,的更新。,使用封锁机制解决读“脏”数据问题,T,1,T,2,Xlock,C,R(C)=100,CC*2,W(C)=200,Slock,C,等待,ROLLBACK,等待,(C,恢复为,100),等待,Unlock C,等待,获得,Slock,C,R(C)=100,Commit C,Unlock C,事务,T1,在对,C,进行修改之前,先对,C,加,X,锁,修改其值后写回磁盘,T2,请求在,C,上加,S,锁,因,T1,已在,C,上加了,X,锁,,T2,只能等待,T1,因某种原因被撤销,,C,恢复为原值,100,T1,释放,C,上的,X,锁后,T2,获得,C,上的,S,锁,读,C=100,。避免了,T2,读“脏”数据,不读“脏”数据,使用封锁机制解决不可重复读问题,T,1,T,2,Slock,A,Slock,B,R(A)=50,R(B)=100,求和,=150,Xlock,B,等待,等待,R(A)=50,等待,R(B)=100,等待,求和,=150,等待,Commit,等待,Unlock A,等待,Unlock B,等待,获得,XlockB,R(B)=100,BB*2,W(B)=200,Commit,Unlock B,事务,T1,在读,A,,,B,之前,先对,A,,,B,加,S,锁,其他事务只能再对,A,,,B,加,S,锁,而不能加,X,锁,即其他事务只能读,A,,,B,,而不能修改,当,T2,为修改,B,而申请对,B,的,X,锁时被拒绝只能等待,T1,释放,B,上的锁,T1,为验算再读,A,,,B,,这时读出的,B,仍是,100,,求和结果仍为,150,,即可重复读,T1,结束才释放,A,,,B,上的,S,锁。,T2,才获得对,B,的,X,锁,封锁协议,简单地对数据加,X,锁和,S,锁并不能保证数据库的一致性。在对数据对象加锁时,还需要约定一些规则。这些规则称为,封锁协议,(Locking Protocol),。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。,一级封锁协议,一级封锁协议是:事务,T,在修改数据之前必须先对其加,X,锁,直到事务结束才释放;,根据该协议要求,将表中的任务,T,1,、,T,2,作为事务,用,A,表示库存,重新执行各操作的过程见表过程见表所示。,遵循一级封锁协议的事务执行过程,顺序,T1,T2,库存,A,的值,1,Xlock,A,获得,50,2,读,A=50,Xlock,A,,等待,50,3,A=A+100,写回,A=150,Commit,Unlock A,等待,150,4,获得,Xlock,A,读,A=150,A=A-40,写回,A=110,Commit,Ulock,A,110,一级封锁协议可有效地防止“丢失更新”,并能够保证事务,T,的可恢复性。,但是,由于一级封锁没有要求对读数据进行加锁,所以不能保证可重复读和不读“脏”数据。,遵从一级封锁协议发生的读“脏”数据过程,顺序,T1,T2,库存,A,的值,1,Xlock,A,获得,读,A=50,A=A+100,写回,A=150,Unlock A,50,150,2,读,A=150,150,3,ROLLBACK,50,二级封锁协议,事务,T,对要修改数据必须先加,X,锁,直到事务结束才释放,X,锁;对要读取的数据必须先加,S,锁,读完后即可释放,S,锁。,遵从二级封锁协议发生的“不可重复读”的过程,顺序,T1,T2,A,的值,B,的值,1,Slock,A,,,B,获得,读,A=50,读,B=100,Ulock,A,,,B,Xlock,B,等待,等待,获得,50,100,2,求和,A+B=150,Slock,A,得到,Slock,B,等待,等待,获得,读,B=100,BB,4,回写,B=400,Commit,Ulock,B,50,100,400,3,读,A,50,读,B=400,和,450,(验算错误),50,400,三级封锁协议,三级封锁协议是事务,T,在读取数据之前必须先对其加,S,锁,在要修改数据之前必须先对其加,X,锁,直到事务结束后才释放所有锁。,由于三级封锁协议强调即使事务读完数据,A,之后也不释放,S,锁,从而使得别的事务无法更改数据,A,。三级封锁协议不但防止了丢失修改和不读“脏”数据,而且防止了不可重复读。,三、活锁和死锁,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,都没有获得全部需要的数据,所以它们不会结束,只能继续等待。,这种多事务交错等待的僵持局面称为死锁。,数据库中解决死锁问题主要有两类方法:一类方法是采用一定措施来预防死锁的发生;另一类方法是允许发生死锁,然后采用一定手段定期诊断系统中有无死锁,若有则解除之。,1,)预防死锁,死锁的预防,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待;,预防死锁的发生就是要破坏产生死锁的条件;,预防死锁的方法,一次封锁法,顺序封锁法,一次封锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行;,一次封锁法存在的问题:,降低并发度,扩大封锁范围,将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度,难于事先精确确定封锁对象,顺序封锁法,顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。,顺序封锁法存在的问题,维护成本,数据库系统中封锁的数据对象极多,并且在不断地变化。,难以实现:很难事先确定每一个事务要封锁哪些对象,2,)死锁的诊断与解除,死锁的诊断,超时法,事务等待图法,超时法,如果一个事务的等待时间超过了规定的时限,就认为发生了死锁;,优点:实现简单,缺点,有可能误判死锁,时限若设置得太长,死锁发生后不能及时发现,等待图法,用事务等待图动态反映所有事务的等待情况,事务等待图是一个有向图,G=(T,,,U),T,为结点的集合,每个结点表示正运行的事务,U,为边的集合,每条边表示事务等待的情况,若,T,1,等待,T,2,,则,T,1,,,T,2,之间划一条有向边,从,T,1,指向,T,2,事务等待图,图,(a),中,事务,T1,等待,T2,,,T2,等待,T1,,产生了死锁;,图,(b),中,事务,T1,等待,T2,,,T2,等待,T3,,,T3,等待,T4,,,T4,又等待,T1,,产生了死锁;,图,(b),中,事务,T3,可能还等待,T2,,在大回路中又有小的回路,;,并发控制子系统周期性地(比如每隔数秒)生成事务等待图,检测事务。如果发现图中存在回路,则表示系统中出现了死锁。,解除死锁,选择一个处理死锁代价最小的事务,将其撤消;,释放此事务持有的所有的锁,使其它事务能继续运行下去;,数据共享与数据一致性是一对矛盾;,数据库的价值在很大程度上取决于它所能提供的数据共享度,数据共享在很大程度上取决于系统允许对数据并发操作的程度,数据并发程度又取决于数据库中的并发控制机制;,数据的一致性也取决于并发控制的程度。施加的并发控制愈多,数据的一致性往往愈好。,事务和锁是并发控制的主要机制,,,SQL Server,通过支持事务机制来管理多个事务,保证数据的一致性,并使用事务日志保证修改的完整性和可恢复性。,SQL Server,遵从三级封锁协议,从而有效的控制并发操作可能产生的丢失更新、读“脏”数据、不可重复读等错误。,本章总结,并发控制概述,多事务执行方式,并发操作可能产生的问题(丢失修改、读脏数据、不可重复读),封锁机制,两类最常用的封锁,排他锁(,X,锁),共享锁(,S,锁),封锁协议,一级、二级、三级封锁协议,活锁:先来先服务,死锁:,预防方法,一次封锁法,顺序封锁法,死锁的诊断与解除,超时法,等待图法,
展开阅读全文