第7章__事务与并发控制.ppt

上传人:s****8 文档编号:69406956 上传时间:2023-01-03 格式:PPT 页数:21 大小:592KB
返回 下载 相关 举报
第7章__事务与并发控制.ppt_第1页
第1页 / 共21页
第7章__事务与并发控制.ppt_第2页
第2页 / 共21页
点击查看更多>>
资源描述

《第7章__事务与并发控制.ppt》由会员分享,可在线阅读,更多相关《第7章__事务与并发控制.ppt(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第7章 事务与并发控制7.1事务7.2并发控制7.1 事务7.1.1事务的特性事务具有如下特性:原子性(Atomicity),事务是一个不可分割的整体,它对数据库的操作要么全做,要么全不做,即不允许事务部分地完成,若因故障而导致事务未能完成,则应通过恢复功能使数据库回到该事务执行前的状态。一致性(Consistency),事务对数据库的作用应使数据库从一个一致状态转换到另一个一致状态。一致状态是指数据库中的数据满足完整性约束。隔离性(Isolation),多个事务并发执行时,应互不影响,其结果要和这些事务独立执行的结果一样。并发控制就是为了保证事务间的隔离性。持久性(Durability),一

2、旦事务执行成功,则该事务对数据库进行的所有更新都是持久的,即使因数据库故障而受到破坏,DBMS也能恢复。事务的这些特性简称为ACID特性,DBMS一般都能保证事务的ACID特性。7.1.2 事务类型与事务的状态1事务类型事务一般可分为两类:系统事务和用户定义的事务。系统事务又称为隐式事务,指某些特定的SQL语句由系统单独作为一个事务处理,包括的主要语句如下:所有的CREATE语句;所有的DROP语句;INSERT,UPDATE,DELETE语句。例如,执行如下的创建表语句:CREATETABLExx(f1intnotnull,f2char(10),f3varchar(30)这条语句本身就构成了

3、一个事务,它要么建立含3列的表结构,要么对数据库没有任何影响。在实际应用中,大量使用的是用户定义的事务。用户事务的定义方法:用BEGINTRANSACTION语句指定一个事务的开始,用COMMIT或ROLLBACK语句表明一个事务的结束。注意必须明确指定事务的结束,否则系统将把从事务开始到用户关闭连接之间所有的操作都作为一个事务来处理。7.1.2 事务类型与事务的状态(1)开始事务语法格式:BEGINTRANSACTION功能:控制事务的开始。(2)结束事务事务提交语法格式:COMMIT功能:COMMIT语句用于提交事务,即将事务对数据库的所有更新写到物理数据库中,同时,也标志一个事务的结束。

4、事务回滚语法格式:ROLLBACK功能:事务回滚,即将事务对数据库已完成的操作全部撤销,回滚到事务开始时的状态,它也标志一个事务的结束,ROLLBACK语句将清除自事务的起点或到某个保存点所做的所有数据修改,并且释放由事务控制的资源。以下例子说明事务处理语句的使用。7.1.2 事务类型与事务的状态【例例7.1】定义一个事务,将“计算机”专业学生的密码改为“1234”,并提交该事务。BEGINTRANSACTIONUSEXSCJUPDATEXSSET密码=1234WHERE专业=计算机COMMIT在SQLServer2005中,ROLLBACK还可以加上选项TRANSACTION|,保存点名或保

5、存点变量名可用SAVETRANSACTION语句设置:SAVETRANSACTION保存点名|保存点变量名【例例7.2】定义一个事务,向XSCJ数据库的XS表中插入一行数据,然后删除该行。BEGINTRANSACTIONUSEXSCJINSERTINTOXS(学号,姓名,性别,出生时间,专业)VALUES(07050104,朱一虹,1,1989-10-21,计算机应用)SAVETRANMy_savDELETEFROMXSWHERE姓名=朱一虹ROLLBACKTRANMy_savCOMMITTRAN7.1.2 事务类型与事务的状态执行上述事务后,可知:新插入的数据行并没有被删除,因为事务中使用R

6、OLLBACK语句将操作回滚到保存点My_sav,即删除前的状态。2事务的状态图7.1说明了一个事务对数据库进行操作时,其生存周期内可能进入的状态。图7.1事务的状态描述7.1.2 事务类型与事务的状态活动状态:表示事务正在执行中。提交未完成状态:表示事务虽然已完成,但事务对数据的更新可能还在缓冲区,未写到数据库中。失败状态:在两种状态下,事务可能进入失败状态。一个处于活动状态的事务在执行过程中发生故障,将进入失败状态。一个处于提交未完成状态的事务执行时发生故障,将进入失败状态。对于处于失败状态的事务必须进行回滚,才能使数据库处于一致状态。提交已完成状态:处于提交已完成状态的事务表示事务已执行

7、完毕,数据已写入数据库,并处于一致状态。终止状态:表示事务执行回滚操作,数据库恢复到事务执行前的一致状态。7.2 并发控制对数据库进行操作的事务可以以串行方式执行,即一个事务执行结束后,另一事务才开始执行,这种调度方式称为串行调度,存在的缺点是系统资源利用率低,对用户响应慢。因此通常采用的方案是多个事务并发执行,这分为两种情况:单处理机情况下,多个事务轮流交叉运行,称为交叉并发方式;多处理机的情况下,多个事务在多个处理机上同时运行,称为同时并发执行,在并发执行方式下,当多个事务同时对数据库中的同一数据进行操作时,如果DBMS不进行有效的管理和控制,就会破坏数据的一致性。7.2.1 并发控制需解

8、决的问题多个事务并发执行时,数据的不一致主要表现为:数据丢失更新、读“脏”数据、不可重复读。1数据丢失更新所谓丢失更新(LostUpdate),是指两个或多个事务在并发执行的情况下,都对同一数据项更新(即先读后改,再写入),从而导致后面的更新覆盖前面的更新。例如,对于联网售票系统,设有两个事务T1,T2都要求访问数据项A,设事务T1,T2执行前A的值为20,T1,T2的执行顺序如图7.2所示,当事务T1读得的值为20,T2读得的值也是20;T1写入A的值为19,T2写入A的值也是19,显然这与事实不符,这是由于两个事务并发地对同一数据写入而引起的,因此这种情况又称为写-写冲突。2读“脏”数据读

9、“脏”数据是由于一个事务正在读另一个更新事务尚未提交的数据引起的,这种数据不一致的情况又称为读-写冲突。例如,对于如图7.3所示的两个并发执行的事务T1,T2,T2先读得A的值,T1读得A的值,修改并写入,然后T2读得T1修改后的A的值,T1执行回滚操作,显然T2第二次读到的A的值是一个不存在的值,这是一个“脏”数据。读“脏”数据是由读-写冲突引起的。7.2.1 并发控制需解决的问题图7.2数据丢失更新图7.3读“脏”数据7.2.1 并发控制需解决的问题3不可重复读不可重复读分3种情况:对于并发执行的两个事务T1,T2,当事务T1读取数据某一数据后,事务T2对该数据执行了更新操作,使得T1无法

10、再次读取与前一次相同的结果,如图7.4所示,T1读数据A后,T2修改了数据A,T1再次读数据A,却得到不同的结果。事务T1按一定条件读取某些数据记录后,事务T2插入了一些记录,T1再次以相同条件读取记录时得到不同的结果集。事务T1按一定条件读取某些数据记录后,事务T2删除了其中的一些记录,T1再次以相同条件读取记录时得到不同的结果集。后面两种情况又称为“幻像”读。不可重复读也是由读-写冲突引起的。图7.4不可重复读7.2.2 封锁实现并发控制的一个重要技术是封锁机制,其基本思想是:事务T在对某个数据对象(如表、记录等)操作之前,先向DBMS发出请求,申请对该数据对象加锁。当得到锁后,才可对该数

11、据对象进行相应的操作,在事务T释放锁之前,其他事务不能更新此数据对象。DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。按锁的功能,一般将锁分为如下几类。1封锁类型(1)共享(S)锁共享锁又称为读锁,一个事务T要读取数据对象A首先必须对A加共享锁,然后才能读A,一旦读取完毕,便释放A上的共享锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享锁。当一个数据对象上已存在共享锁时,其他事务可以读取数据,但不能修改数据。(2)排他(X)锁排他锁又称为独占锁、写锁,一个事务T要更改数据对象A首先必须对A加排他锁,然

12、后才能读或更改A,在T释放A上的排他锁之前,其他任何事务不能读取或更改A。(3)更新(U)锁当一个事务T对数据对象A加更新锁,首先对数据对象做更新锁锁定,这样数据将不能被修改,但可以读取,等到执行数据更新操作时,自动将更新锁转换为独占锁,但当对象上有其他锁存在时,无法对其作更新锁锁定。7.2.2 封锁(4)意向锁对于数据库中的数据对象,可用如图7.5所示的层次树表示。意向锁表示一个事务为了访问数据库对象层次结构中的某些底层资源(如表中的元组)而加共享锁或排他锁的意向。意向锁可以提高系统性能,因为DBMS仅在表级检查意向锁就可确定事务是否可以安全地获取该表上的锁,而无须检查表中每个元组的锁来确定

13、事务是否可以锁定整个表。意向锁包括意向共享(IS)、意向排他(IX)及意向排他共享(SIX)。图7.5数据库对象的层次树7.2.2 封锁意向共享(IS)锁:如果对一个数据对象加IS锁,表示拟对它的后裔节点加S锁,读取底层的数据。例如,若要对某个元组加S锁,则首先应对元组所在的关系或数据库加IS锁。意向排他(IX)锁:如果对一个数据对象加IX锁,表示拟对它的后裔节点加X锁,更新底层的数据。例如,若要对某个关系加X锁,以便插入一个元组,则首先应对数据库加IX锁。意向排他共享(SIX)锁:如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。例如,对某个表加SIX锁,则表示该

14、事务要读整个表(所以要对该表加S锁),同时会更新个别元组(所以要对该表加IX锁)。表7.1给出了上述封锁类型的作用。有些锁之间是相容的,如共享锁和更新锁;有些锁之间是不相容的,如共享锁和排他锁。表7.2列出了各种锁之间的相容性。7.2.2 封锁表7.1锁类型及其作用锁 模 式描 述共享(S)用于只读操作,如 SELECT 语句更新(U)用于可更新的资源中,防止当多个会话在读取、锁定及随后可能进行的资源更新时发生常见形式的死锁排他(X)用于数据修改操作,如 INSERT,UPDATE 或 DELETE,确保不会同时对同一资源进行多重更新意向用于建立锁的层次结构,意向锁的类型为意向共享(IS)、意

15、向排他(IX)及意向排他共享(SIX)表7.2各种锁之间的相容性锁 模 式ISSUIXSIXXIS相容相容相容相容相容不相容S相容兼容相容不相容不相容不相容U相容相容不相容不相容不相容不相容IX相容不相容不相容相容不相容不相容SIX相容不相容不相容不相容不相容不相容X不相容不相容不相容不相容不相容不相容7.2.2 封锁当一个事务T申请对数据对象A加锁时,若该数据对象上已加了锁,新加的锁必须满足表7.2中锁的相容性。不同的DBMS支持的锁类型可能不同,例如,对于SQLServer共有6种锁类型,分别是:共享、更新、排他、意向、架构和大容量更新,所以针对具体的DBMS,应参考其使用手册。2封锁粒度

16、被锁定的对象的数据量称为封锁粒度。封锁对象可以是逻辑单元,也可以是物理单元。以关系数据库为例,封锁对象可以是行、列、索引项、页、扩展盘区、表和数据库等。封锁粒度不同,系统的开销将不同,并且锁定粒度与数据库访问并发度是矛盾的,锁定粒度大,系统开销小但并发度会降低,且对DBMS来说内部管理更简单;锁定粒度小,系统开销大,但可提高并发度。选择封锁粒度时必须同时考虑开销和并发度两个因素,进行权衡,以求得最优的效果。一般原则为:需要处理大量元组的用户事务,以关系为封锁单元。需要处理多个关系的大量元组的用户事务,以数据库为封锁单元。只处理少量元组的用户事务,以元组为封锁单元。7.2.3 事务的隔离级别事务

17、的隔离级别定义了事务并发执行时,事务之间的隔离程度。如前所述,事务并发执行时,有可能出现数据丢失更新、读“脏”数据、不可重复读,为了避免这些数据不一致的情况,在标准SQL规范中,定义了如下4个事务隔离级别,不同的隔离级别对事务的处理不同。未授权读取(ReadUncommitted):允许读“脏”数据,但不允许更新丢失。如果一个事务已经开始写数据,则允许其他事务读此数据,但不允许同时进行写操作。授权读取(ReadCommitted):读取数据的事务允许其他并行事务访问该数据,但是未提交的写事务将禁止其他事务同时访问该数据。这是大多数主流数据库的默认事务隔离等级,保证了一个事务不会读到另一个并行事

18、务已修改但未提交的数据,避免了读“脏”数据。该级别适用于大多数系统。可重复读(RepeatableRead):禁止不可重复读和读“脏”数据,但有时可能出现“幻像”数据,读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务,这保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了读“脏”数据和“不可重复读”的情况。序列化(Serializable):提供严格的事务隔离,它要求事务序列化执行,即事务只能一个接着一个地执行。事务的隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于大多数应用程序,可以优先考虑把数据库系统的隔离级别设为Rea

19、dCommitted,它能够避免读“脏”数据,而且有较好的并发性能。7.2.4 死锁如果两个或多个事务每个都持有另一事务所需资源上的锁,没有这些资源,每个事务都无法继续完成其工作,这种情况称为死锁。以下是一个简单的死锁场景:事务A访问表T,并请求页面X上的排他锁;事务B访问表T,并请求页面Y上的排他锁;事务A请求页面Y上的锁,同时持有页面X上的排他锁,事务A将被挂起,因为事务B持有页面Y上的排他锁;事务B请求页面X上的锁,同时持有页面Y上的排他锁,事务B将被挂起,因为事务A持有页面X上的排他锁。此时,事务的执行进入一种僵持状态,即发生了死锁,应用程序A和B都无法继续工作。目前解决并发事务死锁问

20、题的方法主要有:一是采取措施预防死锁发生;二是允许死锁发生,采用一定的手段检测是否有死锁,如果有就解除死锁。1死锁的预防防止死锁的发生就是要破坏产生死锁的条件,通常有如下两种办法。7.2.4 死锁1死锁的预防防止死锁的发生就是要破坏产生死锁的条件,通常有如下两种办法。(1)一次封锁法要求每个事务必须一次将所有要访问的数据对象全部加锁,否则就不能继续执行。该方法可有效地预防死锁,但存在的问题是:一次就将以后要访问的全部数据对象加锁,扩大了封锁的范围,从而降低了系统的并发度。另外,数据库中的数据是不断变化的,很难事先准确地确定每个事务所要封锁的数据对象。(2)顺序封锁法预先对数据对象规定一个封锁顺

21、序,所有事务都按这个顺序实行封锁。该方法可以有效地预防死锁,但存在的问题是:数据库系统中可封锁的数据对象极多,并且随着数据的插入、删除等操作而不断变化,要维护这些数据对象的封锁顺序非常困难,成本很高。此外,事务的封锁请求是随着事务的执行动态决定的,很难事先确定每个事务要封锁哪些对象,这样,就很难按规定的顺序封锁对象。上述预防死锁的策略并不很适合并发控制的实际应用,因此,DBMS在解决死锁问题上大多采用的是诊断并解除死锁的方法。7.2.4 死锁2死锁的诊断DBMS的并发控制子系统定期检测系统中是否存在死锁,一旦检测到死锁,就设法解除。并发控制子系统检测死锁的方法主要有:(1)超时法如果一个事务的

22、等待时间超过了规定的时限,就认为发生了死锁。这种方法实现简单,但存在两个问题:一是可能误判死锁,如果事务是由于其他原因而使等待时间长,系统会认为是发生了死锁;二是时限的设置问题,若时限设置得太长,可能导致死锁发生后不能及时发现。(2)等待图法等待图法是动态地根据并发事务之间的资源等待关系构造一个有向图,并发控制子系统周期性地检测该有向图是否出现环路,若有,则说明出现了死锁。等待图G=(T,U),其中,T为节点的集合,U为有向边的集合,一个节点表示并发执行的一个事务,如果事务T1等待事务T2释放锁,则从事务T1的节点引一有向边至事务T2的节点。3死锁的解除DBMS的并发控制子系统一旦检测到系统存在死锁,就要设法解除,通常采用的方法是选择一个处理死锁代价最小的事务,将其撤销,释放该事务持有的所有的锁,使其他事务能继续运行。习题习题 1举例说明事务非正常结束时会影响数据库数据的正确性。2什么是日志文件?为什么需要日志文件?3登记日志文件时为什么必须先写日志文件,后写数据库?4什么是检查点记录?检查点记录包括哪些内容?5并发控制需解决哪些问题?什么是封锁?6如何防止死锁?

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com