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