资源预览内容
第1页 / 共51页
第2页 / 共51页
第3页 / 共51页
第4页 / 共51页
第5页 / 共51页
第6页 / 共51页
第7页 / 共51页
第8页 / 共51页
第9页 / 共51页
第10页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
返回返回第7章数据库系统的恢复和并发控制1返回返回7.1 数据库并发性的含义 上一章讨论的完整性是保证各个事务本身能得到正确 的数据,只考虑一个用户使用数据库的情况,但实际 上数据库中有许多用户。 每个用户在存取数据库中的数据时,可能是串行执行 ,即每个时刻只有一个用户程序运行,也可能是多个 用户并行地存取数据库。 数据库的最大特点之一就是数据资源是共享的,串行 执行意味着一个用户在运行程序时,其他用户程序必 须等到这个用户程序结束才能对数据库进行存取,这 样如果一个用户程序涉及大量数据的输入/输出交换, 则数据库系统的大部分时间将处于闲置状态。7 并发控制与封锁2返回返回因此,为了充分利用数据库资源,很多时候数 据库用户都是对数据库系统并行存取数据,这 样就会发生多个用户并发存取同一数据块的情 况,如果对并发操作不加控制可能会产生不正 确的数据,破坏数据的完整性,并发控制就是 解决这类问题,以保持数据库中数据的一致性 。 7.2 事务(Transaction) 7.2.1 事务的定义 DBMS的并发控制是以事务为基本单位进行的。 那么到底什么是事务呢?3返回返回 事务是数据库系统中执行的一个工作单位,它是由用 户定义的一组操作序列。 一个事务可以是一组SQL语句、一条SQL语句或整个程 序,一个应用程序可以包括多个事务。 事务的开始与结束可以由用户显式控制。如果用户没 有显式地定义事务,则由DBMS按照缺省规定自动划分 事务。在SQL语言中,定义事务的语句有三条: v BEGIN TRANSACTION v COMMIT v ROLLBACKv BEGIN TRANSACTION表示事务的开始; v COMMIT表示事务的提交,即将事务中所有对数据库的更新写 回到磁盘上的物理数据库中去,此时事务正常结束; v ROLLBACK表示事务的回滚,即在事务运行的过程中发生了某 种故障,事务不能继续执行,系统将事务中对数据库的所有 已完成的更新操作全部撤销,再回滚到事务开始时的状态。 4返回返回7.2.2 事务的特征 事务是由有限的数据库操作序列组成,但并不是任意 的数据库操作序列都能成为事务,为了保护数据的完 整性,一般要求事务具有以下四个特征:1原子性(Atomic) 一个事务是一个不可分割的工作单位,事务在执行时 ,应该遵守“要么不做,要么全做”(nothing or all)的原则,即不允许事务部分的完成。 即使因为故障而使事务未能完成,它执行的部分结果 要被取消。5返回返回2一致性(Consistency) 事务对数据库的作用是数据库从一个一致状态 转变到另一个一致状态。 所谓数据库的一致状态是指数据库中的数据满 足完整性约束。 v例如,银行企业中,“从帐号A转移资金额R到帐号 B”是一个典型的事务,这个事务包括两个操作,从 帐号A中减去资金额R和在帐号B中增加资金额R,如 果只执行其中一个操作,则数据库处于不一致状态 ,帐务会出现问题。也就是说,两个操作要么全做 ,要么全不做,否则就不能成为事务。 可见事务的一致性与原子性是密切相关的。6返回返回3隔离性(Isolation) 如果多个事务并发地执行,应像各个事务独立 执行一样,一个事务的执行不能被其他事务干 扰。 即一个事务内部的操作及使用的数据对并发的 其他事务是隔离的。 并发控制就是为了保证事务间的隔离性。4持久性(Durability) 指一个事务一旦提交,它对数据库中数据的改 变就应该是持久的,即使数据库因故障而受到 破坏,DBMS也应该能够恢复。7返回返回 事务上述四个性质的英文术语的第一个字母为ACID。 因此,这四个性质以称为事务的ACID准则。 下面是一个事务的例子,从帐号A转移资金额R到帐号B : BEGIN TRANSACTIONREAD AAA-RIF A0 /* A 款不足*/THENBEGINDISPLAY “A款不足”ROLLBACKEND ELSE /* 拨款 */BEGINBB+RDISPLAY “拨款完成”COMMITEND8返回返回这是对一个简单事务的完整的描述。 该事务有两个出口: v当A 帐号的款项不足时,事务以ROLLBACK( 撤销)命令结束,即撤销该事务的影响; v另一个出口是以COMMIT(提交)命令结束,完 成从帐号A到帐号B的拨款。 q在COMMIT之前,即在数据库修改过程中,数据可能 是不一致的,事务本身也可能被撤销。 q只有在COMMIT之后,事务对数据库所产生的变化才 对其他事务开放,这就可以避免其他事务访问不一致或 不存在的数据。 9返回返回7.3 并发操作与数据的不一致性 当同一数据库系统中有多个事务并发运行时,如果不加 以适当控制,可能产生数据的不一致性。例1并发取款操作。假设存款余额R=1000元,甲事务T1取 走存款100元,乙事务T2取走存款200元,如果正常操作 ,即甲事务T1执行完毕再执行乙事务T2,存款余额更新 后应该是700元。但是如果按照如下顺序操作,则会有 不同的结果: v甲事务T1读取存款余额R =1000元; v乙事务T2读取存款余额R =1000元; v甲事务T1取走存款100元,修改存款余额R =R 100=900 ,把R =900写回到数据库; v乙事务T2取走存款200元,修改存款余额R =R 200=800 ,把R =800写回到数据库。 10返回返回结果两个事务共取走存款300元,而数据库中 的存款却只少了200元。 得到这种错误的结果是由甲乙两个事务并发操 作引起的,数据库的并发操作导致的数据库不 一致性主要有以下三种: 1丢失更新(Lost Update) 当两个事务T1和T2读入同一数据做修改,并发 执行时, T2把T1或T1把T2的修改结果覆盖掉, 11返回返回造成了数据的丢失更新问题,导致数据的不一 致。 仍以上例中的操作为例进行分析。 v在表7.1中,数据库中R的初值是1000,事务T1包含 三个操作:读入R初值(FIND R);计算(R=R-100 );更新R(UPDATE R)。 v事务T2也包含三个操作:FIND R;计算(R=R-200) ;UPDATE R。 v如果事务T1和T2顺序执行,则更新后,R的值是700。 但如果T1和T2按照表7.1所示的并发执行,R的值是 800,得到错误的结果,原因在于在t7时刻丢失了T1 对数据库的更新操作。 v因此,这个并发操作不正确。12返回返回表7.1 丢失更新问题时间事务T1数据库中R的值事务T2T0 1000 t1FIND R t2 FIND Rt3R=R-100 t4 R=R-200t5UPDATE R t6 900UPDATE Rt7 800 13返回返回2污读(Dirty Read)(读脏数据) 事务T1更新了数据R,事务T2读取了更新后的数据R, 事务T1由于某种原因被撤消,修改无效,数据R恢复原 值。事务T2得到的数据与数据库的内容不一致,这种 情况称为“污读”(读脏数据)。 在表7.2中,事务T1把R的值改为900,但此时尚未做 COMMIT操作,事务T2将修改过的值900读出来,之后事 务T1执行ROLLBACK操作,R的值恢复为1000,而事务T2 将仍在使用已被撤消了的R值900。 原因在于在t4时刻事务T2读取了T1未提交的更新操作结 果,这种值是不稳定的,在事务T1结束前随时可能执 行ROLLBACK操作。 对于这些未提交的随后又被撤消的更新数据称为“脏 数据”。 v 比如,这里事务T2在t2时刻读取的就是“脏数据”。14返回返回表7.2 污读问题 时间事务T1数据库中R的值事务T2t0 1000 t1FIND R t2R=R-100 t3UPDATE R t4 900FIND Rt5ROLLBACK t6 1000 15返回返回3不可重读(Unrepeatable Read) 事务T1读取了数据R,事务T2读取并更新了数据R,当事 务T1再读取数据R以进行核对时,得到的两次读取值不 一致,这种情况称为“不可重读”。 在表7.3中,在t0时刻事务T1读取R的值为1000,但事务 T2在t4时刻将R的值更新为为800。所以T1所使用的值已 经与开始读取的值不一致。时间事务T1数据库中R的值事务T2t0 1000 t1FIND R t2 FIND Rt3 R=R-200t4 UPDATE Rt5 800 表7.3 不可重读问题16返回返回 产生上述三类数据不一致性的主要原因就是并发操作 破坏了事务的隔离性。 并发控制就是要求DBMS提供并发控制功能以正确的方 式高度并发事务,避免并发事务之间的相互干扰造成 数据的不一致性,保证数据库的完整性。7.4 封锁 实现并发控制的方法主要是封锁技术。 7.4.1 封锁类型(Lock Type) 所谓封锁就是当一个事务在对某个数据对象(可以是 数据项、记录、数据集、以至整个数据库)进行操作 之前,必须获得相应的锁,以保证数据操作的正确性 和一致性。17返回返回 封锁是目前DBMS普遍采用的并发控制方法,基本 的封锁类型有两种:排它锁和共享锁。 1排它锁(Exclusive Lock) v排它锁又称写锁,简称为X锁,其采用的原理是禁止并发 操作。 v当事务T对某个数据对象R实现X封锁后,其他事务要等T 解除X封锁以后,才能对R进行封锁。这就保证了其他事 务在T释放R上的锁之前,不能再对R进行操作。 2共享锁(Share Lock) v共享锁又称读锁,,简称为S锁,其采用的原理是允许其 他用户对同一数据对象进行查询,但不能对该数据对象 进行修改。 v当事务T对某个数据对象R实现S封锁后,其他事务只能对 R加S锁,而不能加X锁,直到T释放R上的S锁。 v这就保证了其他事务在T释放R上的S锁之前,只能读取R ,而不能再对R作任何修改。18返回返回7.4.2 封锁协议(Lock Protocol) 封锁可以保证合理的进行并发控制,保证数据的一致性 。 在封锁时,要考虑一定的封锁规则,例如,何时开始封 锁、封锁多长时间、何时释放等,这些封锁规则称为封 锁协议。 对封锁方式规定不同的规则,就形成了各种不同的封锁 协议。 封锁协议在不同程序上对正确控制并发操作提供了一定 的保证。 上面讲述过的并发操作所带来的丢失更新、污读和不可 重读等导致数据不一致性问题,可以通过三级封锁协议 在不同程度上给予解决,下面介绍三级封锁协议。19返回返回1一级封锁协议 一级封锁协议的内容是:事务T在修改数据对象之前必 须对其加X锁,直到事务结束。 具体地说,就是任何企图更新记录R的事务必须先执行 “XLOCK R”操作,以获得对该记录进行寻址的能力并 对它取得X封锁。 如果未获准“X 封锁”,那么这个事务进入等待状态, 一直到获准“X封锁”,该事务才继续做下去。 该事务规定事务在更新记录R时必须获得排它性封锁, 使得两个同时要求更新R的并行事务之一必须在一个事 务更新操作执行完成之后才能获得X封锁,这样就避免 了两个事务读到同一个R值而先后更新时所发生的丢失 更新问题。20返回返回利用一级封锁协议可以解决表7.1中的数据丢失 更新问题,如表7.4所示。 事务T1先对R进行X封锁(XLOCK),事务T2执行 “XLOCK R”操作,未获准“X封锁”,则进 入等待状态,直到事务T1更新R值以后,解除X 封锁操作(UNLOCK X)。 此后事务T2再执行“XLOCK R”操作,获准 “X封锁”,并对R值进行更新(此时R已是事务 T1更新过的值,R=900)。 这样就能得出正确的结果。 21返回返回表7.4 无丢失更新问题时间事务T1数据库中R的值事务T2t0XLOCK R1000 t1FIND R t2 XLOC
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号