,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,数据库系统概论,第十一章 并发控制,11.1,并发控制概述,多事务执行方式,(1),事务串行执行,每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行,不能充分利用系统资源,发挥数据库共享资源的特点,并发控制,(续),(2),交叉并发方式(,interleaved concurrency,),事务的并行执行是这些并行事务的并行操作轮流交叉运行,是单处理机系统中的并发方式,能够减少处理机的空闲时间,提高系统的效率,并发控制(续),(3),同时并发方式(,simultaneous concurrency,),多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行,最理想的并发方式,但受制于硬件环境,更复杂的,并发方式机制,事务并发执行带来的问题,可能会存取和存储不正确的数据,破坏事务的隔离性和数据库的一致性,DBMS,必须提供并发控制机制,并发控制机制是衡量一个,DBMS,性能的重要标志之一,11.1,并发控制概述,并发控制机制的任务,对并发操作进行正确调度,保证事务的隔离性,保证数据库的一致性,T1,的修改被,T2,覆盖了!,读,A=16,AA-3,写回,A=13,读,A=16,AA-1,写回,A=15,事务,T,2,事务,T,1,数据不一致实例:飞机订票系统,并发操作带来的数据不一致性,丢失修改(,lost update,),不可重复读(,non-repeatable read,),读,“,脏,”,数据(,dirty read,),1.,丢失修改,丢失修改是指事务,1,与事务,2,从数据库中读,入同一数据并修改,事务,2,的提交结果破坏了事务,1,提交的结果,,导致事务,1,的修改被丢失。,图,1,三种数据不一致性,T,1,T,2,读,A=16,AA-1,写回,A=15,读,A=16,AA-1,写回,A=15,(,a),丢失修改,2.,读,“,脏,”,数据,事务,1,修改某一数据,并将其写回磁盘,事务,2,读取同一数据后,事务,1,由于某种原因被撤消,这时事务,1,已修改过,的数据恢复原值,事务,2,读到的数据就与数据库中的数据不一致,,是不正确的数据,又称为,“,脏,”,数据。,图,2,三种数据不一致性,(续),读,C=200,读,C=100,CC*2,写回,C,ROLLBACK,C,恢复为,100,T,2,T,1,(,b),读“脏”数据,3.,不可重复读,不可重复读是指事务,1,读取数据后,事务,2,执行更新操作,使事务,1,无法再现前一次读,取结果。,图,3,三种数据不一致性,(续),读,B=100,BB*2,写回,B=200,读,A=50,读,B=100,求和,=150,读,A=50,读,B=200,求和,=250,(,验算不对,),T,2,T,1,(,c),不可重复读,三类,不可重复读,事务,1,读取某一数据后:,1.,事务,2,对其做了修改,,当事务,1,再次读该数据时,得到与前一次不同的值。,2.,事务,2,删除了其中部分记录,,当事务,1,再次读取数据时,发现某些记录神密地消失了。,3.,事务,2,插入了一些记录,,当事务,1,再次按相同条件读取数据时,发现多了一些记录。,后两种不可重复读有时也称为,幻影,现象,11.2,封锁,一、什么是封锁,封锁就是事务,T,在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁,加锁后事务,T,就对该数据对象有了一定的控制,在事务,T,释放它的锁之前,其它的事务不能更新此数据对象。,封锁是实现并发控制的一个非常重要的技术,二、基本封锁类型,DBMS,通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。,基本封锁类型,排它锁(,eXclusive lock,,简记为,X,锁),共享锁(,Share lock,,简记为,S,锁),排它锁,排它锁又称为写锁,若事务,T,对数据对象,A,加上,X,锁,则只允许,T,读取和修改,A,,其它任何事务都不能再对,A,加任何类型的锁,直到,T,释放,A,上的锁,共享锁,共享锁又称为读锁,若事务,T,对数据对象,A,加上,S,锁,则其它事务只能再对,A,加,S,锁,而不能加,X,锁,直到,T,释放,A,上的,S,锁,11.3,封锁协议,在运用,X,锁和,S,锁对数据对象加锁时,需要约定一些规则:封锁协议(,Locking Protocol,),何时申请,X,锁或,S,锁,持锁时间、何时释放,不同的封锁协议,在,不同的程度上,为并发操,作的正确调度提供一定的保证,常用的封锁协议:三级封锁协议,1,级封锁协议,事务,T,在修改数据,R,之前必须先对其加,X,锁,直到事务结束才释放,正常结束,(,COMMIT,),非正常结束,(,ROLLBACK,),1,级封锁协议可防止丢失修改,在,1,级封锁协议中,如果是读数据,不需要加锁的,所以它不能保证可重复读和不读,“,脏,”,数据。,1,级封锁协议,T,1,T,2,Xlock A,获得,读,A=16,AA-1,写回,A=15,Commit,Unlock A,Xlock A,等待,等待,等待,等待,获得,Xlock A,读,A=15,AA-1,写回,A=14,Commit,Unlock A,没有丢失修改,1,级封锁协议,读,A=15,Xlock A,获得,读,A=16,AA-1,写回,A=15,Rollback,Unlock A,T,2,T,1,读“脏”数据,1,级封锁协议,Xlock B,获得,读,B=100,BB*2,写回,B=200,Commit,Unlock B,读,A=50,读,B=100,求和,=150,读,A=50,读,B=200,求和,=250,(,验算不对,),T,2,T,1,不可重复读,2,级封锁协议,1,级封锁协议,+,事务,T,在读取数据,R,前必须,先加,S,锁,,读完后即可释放,S,锁,2,级封锁协议可以防止丢失修改和读,“,脏,”,数据。,在,2,级封锁协议中,由于读完数据后即可释放,S,锁,所以它不能保证可重复读,。,2,级封锁协议,SLOCK A,等待,等待,等待,获得,读,A=15,Commit Unlock A,Xlock A,获得,读,A=16,AA-1,写回,A=15,Rollback,Unlock A,T,2,T,1,不读“脏”数据,2,级封锁协议,不可重复读,Sclock A,获得,读,A=50,Unlock A,Sclock B,获得,读,B=100,Unlock B,求和,=150,Xlock B,等待,等待,获得,Xlock B,读,B=100,BB*2,写回,B=200,Commit,Unlock B,T,2,T,1,Sclock A,获得,读,A=50,Unlock A,Sclock B,获得,读,B=200,Unlock B,求和,=250,(,验算不对,),T,2,T,1,(,续,),3,级封锁协议,1,级封锁协议,+,事务,T,在读取数据,R,之前必须先对其加,S,锁,直到,事务结束才释放,3,级封锁协议可防止丢失修改、读脏数据和不可重复读。,T,1,T,2,Slock A,读,A=50,Slock B,读,B=100,求和,=150,读,A=50,读,B=100,求和,=150,Commit,Unlock A,Unlock B,Xlock B,等待,等待,等待,等待,等待,等待,等待,等待,获得,Xlock B,读,B=100,BB*2,写回,B=200,Commit,Unlock B,可重复读,封锁协议小结,(续),11.4,活锁和死锁,封锁技术可以有效地解决并行操作的一致性问题,但也带来一些新的问题,死锁(,DEAD LOCK,),活锁,(,LIVE LOCK,):系统可能使某个事务永远处于等待状态,得不到封锁的机会,11.4.1,活锁,如何避免活锁,活锁(,LIVE LOCK,):系统可能使某个事务永远处于等待状态,得不到封锁的机会,采用先来先服务的策略:,当多个事务请求封锁同一数据对象时,按请求封锁的先后次序对这些事务排队,该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁。,11.4.2,死锁,T,1,T,2,Xlock R,1,.,.,.,Xlock R,2,等待,等待,等待,.,.,.,Xlock R,2,.,.,Xlock R,1,等待,等待,.,解决死锁的方法,两类方法,1.,预防死锁,2.,死锁的诊断与解除,1.,死锁的预防,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求对已为其他事务封锁的数据对象加锁,从而出现死等待。,预防死锁的发生就是要破坏产生死锁的条件,死锁的预防,(续),预防死锁的方法,一次封锁法,顺序封锁法,(,1,)一次封锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,一次封锁法存在的问题:降低并发度,扩大封锁范围,将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度,一次封锁法,(续),难于事先精确确定封锁对象,数据库中数据是不断变化的,原来不要求封锁的数据,在执行过程中可能会变成封锁对象,所以很难事先精确地确定每个事务所要封锁的数据对象,(,2,)顺序封锁法,顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。,顺序封锁法存在的问题,数据库系统中可封锁的数据对象极其众多,并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困难,成本很高,顺序封锁法,(续),难于实现,事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。,例:规定数据对象的封锁顺序为,A,B,C,D,E,。事务,T3,起初要求封锁数据对象,B,C,E,,但当它封锁了,B,C,后,才发现还需要封锁,A,,这样就破坏了封锁顺序,.,死锁的预防,(续),结论,在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点,DBMS,在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法,2.,死锁的诊断与解除,允许死锁发生,解除死锁,由,DBMS,的并发控制子系统定期检测系统中是否存在死锁,一旦检测到死锁,就要设法解除,检测死锁:,超时法,如果一个事务的等待时间超过了规定的时限,就认为发生了死锁,优点:实现简单,缺点,有可能误判死锁,时限若设置得太长,死锁发生后不能及时发现,死锁的诊断与解除,(续),解除死锁,选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务能继续运行下去。,