,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,第,8,章 事务与并发控制,8.1,事务,8.1.1,事务的基本概念,8.1.2,事务的特征,8.1.3,事务处理模型,8.2,并发控制,8.1.1,事务的基本概念,事务是用户定义的数据操作系列,这些操作作为一个完整的工作单元,一个事务内的所有语句被作为一个整体,要么全部执行,要么全部不执行。,例如:对于一个转帐活动:,A,帐户转帐给,B,帐户,n,元钱,这个活动包含两个动作:,第一个动作:,A,帐户,n,第二个动作:,B,帐户,n,说明,假设第一个操作成功了,第二个操作由于某种原因没有成功,,,在系统恢复,正常,后,,A,账户的金额,应,是,多少,?,如果,B,账户的金额没有变化,则正确的情况是,A,账户的金额也应该,没有变化,。,怎样保证在系统恢复之后,,A,账户中的金额,没有减少,?这就要用到事务的概念。,事务可以保证在一个事务中的全部操作或者全部成功,或者全部失败。,8.1.2,事务的特征,原子性,(,Atomicity,),:指事务是数据库的逻辑工作单位,事务中的操作要么都做,要么都不做。,一致性,(,Consistency,),:指事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。,隔离性,(,Isolation,),:指数据库中一个事务的执行不能被其它事务干扰。,持久性,(,Durability,),:也称为永久性。指事务一旦提交,其对数据库数据的改变就是永久的。,保证事务的,ACID,特性是事务处理的重要任务。,事务的,ACID,特性可能遭到破坏的因素有:,多个事务并行运行时,不同事务的操作有交叉情况;,事务在运行过程中被强迫停止。,8.1.3,事务处理模型,隐式事务,:隐式事务是每一条数据操作语句都自动地成为一个事务。,显式事务,:有显式的开始和结束标记的事务。,ISO,事务处理模型,T-SQL,事务处理模型,(SQL Server,采用,),T-SQL,事务处理模型,每个事务都有显式的开始和结束标记。,事务的开始标记是:,BEGIN TRANSACTION|TRAN,事务的结束标记为:,COMMIT,TRANSACTION,TRAN,ROLLBACK,TRANSACTION,TRAN,示例,BEGIN TRANSACTION,UPDATE,支付表,SET,帐户总额,=,帐户总额,-n,WHERE,帐户名,=,A,UPDATE,支付表,SET,帐户总额,=,帐户总额,+n,WHERE,帐户名,=,B,COMMIT,8.2,并发控制,8.2.1,并发控制概述,8.2.2,并发控制措施,8.2.3,封锁协议,8.2.4,活锁和死锁,8.2.5,并发调度的可串行性,8.2.6,两段锁协议,8.2.1,并发控制概述,数据库中的数据是一个共享的资源,因此会有很多用户同时使用数据库中的数据,,在多用户系统中,可能同时运行着多个事务,而事务的运行需要,时间,,并且事务中的操作是在一定的,数据,上进行的。,当系统中同时有多个事务在运行时,特别是当这些事务是对同一段数据进行操作时,彼此之间就有可能产生,相互干扰,的情况。,如:订票、银行,不同的多事务执行方式,串行执行,每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。,问题:不能充分利用系统资源,发挥数据库共享资源的特点。,T1,T2,T3,不同的多事务执行方式,交叉并行执行,在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉运行。,单处理机系统中的并行事务并没有真正地并行运行,但能够减少处理机的空闲时间,提高系统的效率。,T1,T2,T3,不同的多事务执行方式,同时并发方式,多处理机系统中,每个处理机可以运行一个事务,,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行。,这里讨论单处理机环境下的并发控制技术。,并发事务的相互干扰示例,A,、,B,两个订票点恰巧同时办理同一架航班的飞机订票业务。设其操作过程及顺序如下:,A,订票点(事务,A,)读出航班目前的机票余额数,假设为,10,张;,B,订票点(事务,B,)读出航班目前的机票余额数,也为为,10,张;,A,订票点订出,6,张机票,修改机票余额为,10-6=4,,并将,4,写回到数据库中;,B,订票点订出,5,张机票,修改机票余额为,10-5=5,,并将,5,写回到数据库中;,事务并发执行带来的问题,会产生多个事务同时存取同一数据的情况。,可能会存取和存储不正确的数据,破坏事务一致性和数据库的一致性。,并发控制是衡量,DBMS,性能的重要标志之一。,并发操作带来的数据不一致性,丢失修改,读,“,脏,”,数据,不可重复读,产生,“,幽灵,”,数据,丢失修改,读,“,脏,”,数据,不可重复读,产生,“,幽灵,”,数据,属于不可重复读的范畴。,指当事务,T,1,按一定条件从数据库中读取了某些数据记录后,事务,T,2,删除了其中的部分记录,或者在其中添加了部分记录,则当,T,1,再次按相同条件读取数据时,发现其中莫名其妙地少了(对删除)或多了(对插入)一些记录。,这样的数据对,T,1,来说就是,“,幽灵,”,数据或称,“,幻影,”,数据。,8.2.2,并发控制措施,控制目标:事务运行过程中尽可能隔离事务外操作对本事务数据环境的影响。,并发控制的主要技术,加锁,(Locking),加锁就是事务,T,在对某个数据操作之前,先向系统发出请求,封锁其所要使用的数据。在事务,T,释放它的锁之前,其他事务不能操作这些数据。,锁的类型:,共享锁,、,排他锁,共享锁,简记为,S,锁,:若事务,T,给数据对象,A,加了,S,锁,则事务,T,可以读,A,,但不能修改,A,,其他事务可以再给,A,加,S,锁,但不能加,X,锁,直到,T,释放了,A,上的,S,锁为止。,对于读操作(检索),可以多个事务同时获得共享锁,但阻止其它事务对已获得共享锁的数据进行排它封锁。,排他锁,简记为,X,锁,:若事务,T,给数据对象,A,加了,X,锁,则允许,T,读取和修改,A,,但不允许其他事务再给,A,加任何类型的锁和进行任何操作。,一旦一个事务获得了对某一数据的排他锁,则任何其他事务均不能对该数据进行任何封锁,其他事务只能进入等待状态,直到第一个事务撤销了对该数据的封锁。,锁的相容矩阵,8.2.3,封锁协议,在运用,X,锁和,S,锁对数据对象进行加锁时,还需要约定一些规则,如何时申请,X,锁或,S,锁、持锁时间、何时释放锁等。,称这些规则为,封锁协议,或,加锁协议,。,对封锁方式规定不同的规则,就形成了各种不同级别的封锁协议。,不同级别的封锁协议达到的系统一致性级别不同。,一级封锁协议,对事务,T,要修改的数据加,X,锁,直到事务结束(包括正常结束和非正常结束)时才释放。,一级封锁协议可以防止丢失修改,并保证事务,T,是可恢复的,但不能保证可重复读和不读,“,脏,”,数据。,一级封锁协议示例,没有丢失修改,二级封锁协议,一级封锁协议加上对事务,T,对要读取的数据加,S,锁,读完后即释放,S,锁。,除了可以防止丢失修改外,还可以防止读,“,脏,”,数据。,但不能保证可重复读数据。,二级封锁协议示例,没有读脏数据,三级封锁协议,一级封锁协议加上事务,T,对要读取的数据加,S,锁,并直到事务结束才释放。,除了可以防止丢失修改和不读,“,脏,”,数据之外,还进一步防止了不可重复读。,三级封锁协议示例,可重复读,不同级别的封锁协议总结,8.2.4,活锁和死锁,并发控制的封锁方法可能会引起活锁和死锁等问题。,活锁,避免活锁,简单方法是采用先来先服务的策略。,当多个事务请求封锁同一数据对象时,数据库管理系统按先请求先满足的事务排队策略,当数据对象上的锁被释放后,让事务队列中第一个事务获得锁。,死锁,两个事务相互等待对方先释放资源,则会造成死锁。,预防死锁的方法,一次封锁法:,每个事务一次将所使用数据全部加锁。,存在的问题,降低系统并发度,难于事先精确确定封锁对象,顺序封锁法:,预先对数据对象规定一个封锁顺序,所有事务都按这个顺序封锁。,存在的问题,维护成本:数据库系统中封锁的数据对象极多,并且在不断地变化。,难以实现:很难事先确定每一个事务要封锁哪些对象。,死锁的诊断,超时法,超时法,。如果一个事务的等待时间超过了规定的时限,则认为发生了死锁。,优点是实现起来比较简单,,缺点是可能产生误判的情况:,如果事务因某些原因造成等待时间比较长,超过了规定的等待时限,则系统会误认为发生了死锁。,若时限设置的比较长,则不能对发生的死锁进行及时的处理。,死锁的诊断,等待图法,是一个有向图,G,=(,T,,,U,),。,T,为结点的集合,每个结点表示正在运行的事务;,U,为边的集合,每条边表示事务等待的情况。若,T1,等待,T2,,则,T1,和,T2,之间划一条有向边,从,T1,指向,T2,,,并发控制子系统周期性地(比如每隔几秒)生成事务的等待图,并进行检测。如果发现图中存在回路,则表示系统中出现了死锁。,死锁的解除,通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放此事务所持有的全部锁,使其他事务可以继续运行下去。,而且,对撤销事务所执行的数据修改操作必须加以恢复。,8.2.5,并发调度的可串行性,多个事务的并发执行是正确的,当且仅当其结果与按某一顺序的串行执行的结果相同,则我们称这种调度为,可串行化的调度,。,可串行性是并发事务正确性的准则,按这个准则,一个给定的并发调度,当且仅当它是可串行化的时,才认为是正确的调度。,可串行化调度,例:设有两个事务,分别包含下列操作:,事务,T1,:读,B,;,A=B+1,;写回,A,事务,T2,:读,A,;,B=A+1,;写回,B,设,A,、,B,的初值均为,4,,,按,T1,T2,顺序执行,结果:,A,5,,,B,6,;,按,T2,T1,顺序执行,结果:,A,6,,,B,5,。,当并发调度时,如果执行的结果是这两者之一,则都是正确的结果。,策略,1,:串行调度,策略,2,:并行调度,不可串行化,可串行化,8.2.6,两段锁协议,将所有的事务分为两个阶段对数据进行加锁和解锁:,在对任何数据进行读写操作之前,首先要获得对该数据的封锁。,在释放一个封锁之后,事务不再申请和获得任何其他封锁。,两段锁协议是实现可串行化调度的充分条件。,两段锁协议,可以将每个事务分成两个时期:,申请封锁期,和,释放封锁期,,申请期申请要进行的封锁,释放期释放所占有的封锁。,在申请期不允许释放任何锁,在释放期不允许申请任何锁,这就是两段式封锁。,一些结论,事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。,若并发事务都遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的。,若并发事务的一个调度是可串行化的,不一定所有事务都符合两段锁协议。,调度示例,遵守两段锁协议,不遵守两段锁协议,