第九章_并发_第1页
第九章_并发_第2页
第九章_并发_第3页
第九章_并发_第4页
第九章_并发_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章: 并发控制,并发控制概述 封锁(Locking) 封锁协议 活锁和死锁 并发调度的可串行性 两段封锁协议,并发控制概述,多用户数据库系统: 事务是DBMS的执行单位 多用户操作数据库带来的问题-并发问题 问题1: 在飞机订票系统中,假定有两个售票点甲和乙可以各自售票, 每一航班的剩余票数存放在数据库中, 其结果是丢失修改 丢失修改:两个事务T1和T2读入同一数据并修改, T2提交的结果破坏了T1提交的结果, T1的修改丢失,并发控制概述,并发控制概述,问题2: 两个用户分别对数据库中数据进行操作,结果出现不可重复读现象 不可重复读:事务T1读取某一数据后,事务T2读取并修改了同一数据,使T1无法再现前一次的读取结果 问题3: 两个用户分别对数据库中数据进行操作,结果出现读取脏数据现象 脏读:事务T1修改了某一数据后,事务T2读取了同一数据,而T1由于某种原因被撤销,则称T2读到了脏数据 出现三类问题的原因:破坏了事务的隔离性 有些DBMS提供脏读功能,并发引起的数据不一致性,封锁(Locking),并发控制: 用正确的方式调度并发操作, 避免由于并发操作引起的三类问题-即保证事务的隔离性 并发控制的主要方法: 封锁机制 封锁: 是指事务T在对某个数据对象例如表, 记录等操作之前, 先向系统发出请求, 对其加锁. 加锁后事务T可以操作该对象, 在事务T释放它的封锁之前, 其他的事务不能更新该数据对象 基本的封锁类型: 排它锁(X)和共享锁(S),封锁(Locking),X锁: 排它锁或称写锁, 若事务T对数据对象A加上X锁, 则只允许T读取和修改A, 其他事务对A的任何封锁请求都不能成功 S锁: 共享锁或称读锁, 若事务T对数据对象A加上S锁, 则事务T可以读A, 但不可以修改A, 其他事务可以对A加S锁, 而不可以加X锁 封锁类型的相容矩阵,封锁协议,封锁协议: 对数据对象加锁时, 还需约定一些规则 对封锁方式规定不同的规则, 形成不同的封锁协议 一级封锁协议: 事务T在修改数据R之前必须先对其加X锁, 直到事务结束才释放 可防止丢失修改, T可恢复 如果只是读数据, 不需加锁, 不能保证可重复读, 不读脏数据,R,T1 T2 X N,T1,T2,T1,T2,T1,T2,1 Xlock A 获得 2 读A=16 3 A=A-1 写回:A=15 Commit Unlock A 4 5,Xlock A 等待 等待 等待 等待 获得: Xlock A 读A=15 A=A-1 写回:A=14 Commit Unlock A,不丢失修改,1Slock A Slock B 读A=50 读B=100 求和=150 2 3 读A=50 读B=100 求和=150 Commit Unlock A Unlock B 4 5,Xlock A 等待 等待 等待 等待 等待 等待 获得Xlock A 读B=100 B=B*2 写回 B=200 Commit Unlock A,可重复读,1 Xlock C 获得 读C=10 C=C*2 写回C=20 2 3 rollback C恢复为:10 Unlock C 4 5,Slock C 等待 等待 等待 等待 获得: Slock C 读C=10 Commit Unlock C,不读脏数据,T1,T2,读A=16 读A=15,Xlock A 读A=16 A=A-1 写回:A=15 Commit Unlock A,不丢失修改 不能重复读 可读脏数据,T1,T2,读A=?,Xlock A 读A=16 A=A-1 写回:A=15 Rollback A恢复为:16 Unlock A,封锁协议,二级封锁协议: 一级封锁协议加上事务T在读取数据R之前必须先对其加S锁, 读完后即可释放 可防止读脏数据, 丢失修改 不能保证可重复读 三级封锁协议: 一级封锁协议加上事务T在读取数据R之前必须先对其加S锁, 直到事务结束才释放 可防止读脏数据, 丢失修改 能保证可重复读,活锁和死锁,封锁可以产生死锁 活锁, 死锁:,T1,T2,T3,T4,T1,T2,Lock R unlock,Lock R 等待 等待 等待 等待 等待 等待 等待,活锁,死锁,.,.,Lock R 等待 Lock R unlock,.,Lock R 等待 等待 等待 Lock R,.,Lock R1 Lock R2 等待 等待 等待 等待 等待,Lock R2 Lock R1 等待 等待 等待,.,.,活锁和死锁,解决死锁问题的方法: 预防和检测 死锁的预防 一次封锁法: 要求事务必须一次将所有要使用的数据全部加锁, 否则不能执行 降低并发度 顺序封锁法: 预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁 封锁的数据对象多, 难以预料要封锁哪些对象,活锁和死锁,死锁的诊断和解除: DBMS常用方法, 有超时法和事务等待图法 超时法: 如果一个事务等待的时间超过了规定的时间, 就认为发生了死锁 缺点: 可能误诊, 规定时间不好设 优点: 简单 等待图法: 是一有向图G=(T, U). 节点表示正在执行的事务, 边表示等待情况 死锁诊断: 如果图中存在回路, 系统中发生死锁 死锁解除: 选择一个执行代价最小的事务, 将其撤销, 释放锁,并发调度的可串行性,事务的串行执行: 串行执行一定是正确的 可串行化: 多个事务的并发执行是串行的, 当且仅当其结果和这些事务的某一次串行执行的结果相同的 可串行性: 是并发事务正确性准则 正确调度: 给定的一个并发调度, 当且仅当它是可串行化的, 才认为是正确的 确保并发事务执行可串行化的方法: 2PL, 时间戳等,并发事务的不同调度,T1,T2,T1,T2,T1,T2,Slock B Y=B=2 Unlock B Xlock A A=Y+1 写回A=3 Unlock A,Slock A X=A=3 Unlock A Xlock B B =X+1 写回B=4 Unlock B,Slock B Y=B=2 Unlock B Xlock A A=Y+1 写回A=3 Unlock A,Slock A X=A=2 Unlock A Xlock B B =X+1 写回B=3 Unlock B,不可串行化调度,可串行化调度,Slock B Y=B=2 Unlock B Xlock A A=Y+1 写回A=3 Unlock A,Slock A 等待 等待 等待 X=A=3 Unlock A Xlock B B =X+1 写回B=4 Unlock B,串行化调度,两阶段封锁协议,两段锁协议: 所有事务必须分两个阶段对所要存取的数据项加锁和解锁 在对任何数据进行读写操作之前, 首先申请并获得对该数据项的封锁 在释放一个封锁之后, 事务不再申请和获得任何其他的封锁 可以证明, 若并发执行的所有事务都遵循两段封锁协议, 则对这些事务的任何并发调度策略都是正确的 事务遵守两段封锁协议是可串行化调度的充分条件 遵守两段封锁协议的事务可能发生死锁, 与防止死锁的一次封锁法不同,Slock B 读B=2 Xlock A 等待 等待,Slock A 读A=2 Xlock B 等待 等待,T1,T2,死锁,T1,T2,T1,T2,Slock B 读B=2 Y=B Xlock A A=Y+1 写回A=3 Unlock B Unlock A,Slock A 等待 等待 等待 等待 等待 读A=3 Y=A Xlock B B=Y+1 写回B=4 Unlock B Unlock A,Slock B 读B=2 Y=B Unlock B Xlock A A=Y+1 写回A=3 Unlock A,Slock A 等待 等待 等待 等待 Slock A 读A=3 Y=A Unlock A Xlock B B=Y+1 写回B=4 Unlock B,都是可串行化调度,但并不都遵守两段封锁协议,封锁粒度,封锁粒度: 封锁对象的大小 封锁粒度、系统的并发度和并发控制开销 多粒度锁: 在DBMS中支持多种封锁粒度,数据页,T1,T2,如果是页级锁, T2只能等待 如果是行级锁, T2可以执行 如果T3读全表, 行级锁开销大,ANSI标准SQL事务的4个隔离级别,SQL的隔离级别: 0: 防止“丢失修改” 1:防止“丢失修改、脏读” 2:防止“丢失修改、脏读、不可重复读” 3:可串行化 SQL Server的3级隔离级别: 0: 防止“丢失修改” 1: 防止“丢失修改、脏读” 3:防止“丢失修改、脏读、不可重复读” ANSI 92 SQL3ANSI要求3级为事务的缺省隔离级别。,ANSI标准SQL事务的4个隔离级别,SQL Server缺省级别为1(读后立即释放) 用hold lock 选项加强s锁的限制,实现隔离级别3(ANSI-可串行化) 例如:要读两次时,需要使用hold lock,Sybase中三级封锁协议的实现,设定隔离级别, 缺省方式为1 在会话层设定 set transaction isolation level 0,1,3|read uncommited, read committed, serializable 系统提供的存储过程将在级别1下面执行, 它不会受会话层影响 在语法层上设定: 在select, declare cursor语句中增加选项 select . At isolation0| read uncommited,Sybase中三级封锁协议的实现,利用关键词设定 在select语句中, 加关键词holdlock则设定级别3 在select语句中, 加关键词noholdlock则设定级别0 事务举例: begin transacti

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论