§22数据结构与数据库原理数据库原理11章节

上传人:w****i 文档编号:92241753 上传时间:2019-07-08 格式:PPT 页数:46 大小:346KB
返回 下载 相关 举报
§22数据结构与数据库原理数据库原理11章节_第1页
第1页 / 共46页
§22数据结构与数据库原理数据库原理11章节_第2页
第2页 / 共46页
§22数据结构与数据库原理数据库原理11章节_第3页
第3页 / 共46页
§22数据结构与数据库原理数据库原理11章节_第4页
第4页 / 共46页
§22数据结构与数据库原理数据库原理11章节_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《§22数据结构与数据库原理数据库原理11章节》由会员分享,可在线阅读,更多相关《§22数据结构与数据库原理数据库原理11章节(46页珍藏版)》请在金锄头文库上搜索。

1、第十一章 并发控制,并发控制概述 封锁及封锁协议 活锁与死锁 并发调度的可串行性 两段锁协议 封锁粒度,第一节 并发控制概述,1.并发访问可能带来的数据不一致性: 丢失修改 不可重复读 读“脏”数据,示例,2.并发访问控制技术,产生数据不一致性的主要原因是并发操作破坏了事务的隔离性。 解决办法:封锁,即给事务加锁。,第二节 封锁及封锁协议,1.封锁的类型 排它锁(Exclusive Locks,X锁,写锁) 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的X锁。 共享锁(Share Locks,S锁,读锁) 若事务T对数据对象A加上

2、S锁,则事务T可以读取A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。,2.封锁类型的相容性,问题: 加什么锁? 什么时候加锁? 什么时候解锁?,3.封锁协议,一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。 防止丢失修改。 二级封锁协议:在一级封锁协议基础上,若事务T在读取数据R之前必须先对其加S锁,读完后即可释放。 防止丢失修改,还可防止读“脏”数据。 三级封锁协议:在一级封锁协议基础上,若事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。 防止丢失修改及读脏数据,还可防止不可重复读。,封锁协议,加锁后分析,第三节 活锁与死

3、锁,问题1,1.活锁,活锁:如果事务T1封锁了数据R,事务T2又请求封锁数据R,于是T2等待; T3也请求封锁数据R,当T1 释放了R上的锁之后系统首先批准了T3 , T2仍然等待; 等待队列中的元素出队策略? 预防办法:先来先服务,问题2,2.死锁,死锁:如果事务T1封锁了数据R1,事务T2封锁了数据R2;然后T1又申请封锁R2,于是T1等待;接着T2又申请封锁R1,于是T2也等待; 在有多个封锁数据对象时,如何封锁? 预防办法:一次封锁法、顺序封锁法,死锁的诊断,超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。 等待图法:有向图G=(T,U),T为结点集合,U为边的集合。

4、每个结点表示正在运行的事务,每条边表示事务等待的情况;若T1等待T2,则T1和T2在之间划一条有向边。如果图中有回路,表示系统中出现了死锁。,死锁的解除,如果发生了死锁,则选择处理死锁代价最小的事务,将其撤销,释放此事务持有的所有的锁,使其他事务得以继续运行下去。 对撤销的事务所执行的数据修改操作必须加以恢复。,示例,第四节 并发调度的可串行性,事务的特性之一:隔离性 如果一个事务在运行过程中没有其他事务干扰,那么它的运行结果就是正常的或预期的。 因此所有事务串行起来的调度策略一定是正确的调度策略。 尽管以不同的顺序串行执行事务可能得到不同的结果,但它们都不影响数据库的一致性状态。,示例,事务

5、T1:读B;A=B+1;写回A;事务T2:读A;B=A+1;写回B;,1.可串行化,定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,称这种调度策略为可串行化的调度。 可串行性:是并发事务正确性的准则。按照这个准则规定,一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度。,2.两段锁协议,两段锁协议: 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁; 扩张阶段 在释放一个封锁之后,事务不再申请和获得任何其他封锁。 收缩阶段,示例,遵守两段锁协议 Slock A Slock B Xlock C Unlock C Unlock B

6、 Unlock A,不遵守两段锁协议 Slock A Slock B Unlock B Xlock C Unlock A Unlock C,两段锁协议,可以证明,若并发执行的所有事务均遵守两段锁协议,则这些事务的任何调度策略都是可以串行化的。 是充分条件,但不是必要条件。 上例(d) 可能发生死锁。,第五节 封锁的粒度,封锁粒度:封锁对象的大小。 封锁对象:属性值、属性值集合、记录、关系、索引项、整个索引、数据库、数据页、索引页、数据块,。,1.多粒度封锁,多粒度封锁:在一个系统中同时支持多种封锁粒度供不同事务选择。 多粒度树:数据对象间的层次关系。 根结点粒度最大 叶结点粒度最小,多粒度树,

7、2.多粒度封锁协议,多粒度封锁协议:允许对多粒度树中的每个结点独立地加锁。 某结点被加锁,则它的所有后裔结点也被加了同样的锁。 某结点上的锁: 显式封锁:直接加到数据对象上的锁。 隐式封锁:由上级结点加锁而使该数据对象加上了锁。,封锁冲突检查,该数据对象上的锁 显式封锁检查 其上级结点上的锁 隐式封锁检查 其下级结点上的锁 隐式封锁检查 问题:效率低,3.意向锁,意向锁:如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁,必须先对它的上层结点加意向锁。 封锁冲突检查:不需检查其下级结点上的锁。 具有意向锁的多粒度封锁方法提高了系统并发度,减少了加锁、解锁开销。,意向锁,意

8、向共享锁(IS锁):如果对一个数据对象加IS锁,表示它的后裔结点拟加S锁。 意向排它锁(IX锁):如果对一个数据对象加IX锁,表示它的后裔结点拟加X锁。 共享意向排它锁(SIX锁):如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁。,示例,要读某个元组 该元组加S锁,元组所在关系加IS锁 要读整个关系 该关系加S锁,在数据库上加IS锁 要修改某个元组 该元组加X锁,元组所在关系加IX锁 要读整个关系,并修改某个元组 该关系加S锁和IX锁,在修改的元组上加X锁,4.多粒度封锁的相容性,多粒度封锁的相容性分析,第六节 SQL Server的锁机制,在SQL Server中,锁是用来保证事务

9、的完整性和数据的一致性而对用户的操作所进行的一些限制。 SQL Server自动执行锁定,用户只需要理解和定制应用程序中的锁而无需干预。 在大多数情况下,SQL Server动态锁定策略自动选择查询的最佳锁定粒度。,一、锁管理的对象,SQL Server提供了以下几种锁管理对象:,二、锁定模式,SQL Server提供了以下锁定模式:,三、定制锁,处理超时和设置锁超时持续时间 处理死锁和设置死锁优先级 设置事务隔离级别 对SELECT、INSERT、UPDATE 和 DELETE语句使用表级锁定提示 配置索引的锁定粒度,1.定制锁的时限,SET LOCK_TIMEOUT 指定等待锁释放的毫秒数

10、。 等待时间:返回锁定错误前经过的毫秒数。-1(默认值)表示没有超时期限,即无限期等待; 0表示不等待,一遇到锁就返回信息;当锁等待超过超时值时,被锁住的语句将自动取消,并给应用程序返回一条错误信息。 SQL Server通过全局变量LOCK_TIMEOUT返回当前锁超时设置。 SET LOCK_TIMEOUT 1800 SELECT LOCK_TIMEOUT,2.死锁检测,SQL Server自动检测由锁或其他资源形成的死锁。当SQL Server自动检测到死锁时,它将考虑每个事务已做的工作量,并选择代价最小的那个做为牺牲者,让它回滚。 频繁的死锁检测会有损系统性能。 SQL Server根

11、据死锁发生的频率自动调整死锁检测频率。如果死锁不频繁,则检测算法每5秒运行一次;如果频繁,则一旦某个事务开始等待锁,系统将开始检测。,设置撤销优先级,SET DEADLOCK_PRIORITY LOW | NORMAL | 指定死锁处理优先级。 LOW:指定当前会话为首选死锁牺牲品,SQL Server自动撤销死锁的事务,并给客户端返回死锁错误信息。 NORMAL:指定当前会话返回默认的死锁处理方法。 变量:指定死锁处理方法的变量,LOW为3,NORMAL为6。 示例: SET DEADLOCK_PRIORITY LOW,3.事务的隔离级别,事务的隔离级别定义为: 是否在读数据的时候使用锁 读

12、锁持续多长时间 在读数据的时候使用何种类型的锁 读操作希望读已经被其他事务排它锁锁住的数据时,可以: 一直等到其他事务释放锁 度没有提交的数据 读数据最后提交的版本,隔离性等级,READ UNCOMMITTED(未提交读):在读数据时不检查或使用任何锁。因此,在这种隔离级别中可能读取到没有提交的数据(读脏数据)。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中限制最小的级别。 READ COMMITTED(已提交读):只读取提交的数据并等待其他事务释放排它锁。读数据的共享锁在读操作完成后立即释放。该选项是 SQL Server 的默认值。,隔离性等级,RE

13、PEATABLE READ(可重复读):像已提交读级别那样读数据,但会保持共享锁直到事务结束。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。 SERIALIZABLE(可序列化):工作方式类似于可重复读。但它不仅会锁定受影响的数据,还会锁定这个范围,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。,定制事务的隔离性等级,SET TRANSACTION ISOLATION LEVEL READ COMMITT

14、ED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE 设置隔离性等级。 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ GO BEGIN TRANSACTION SELECT * FROM publishers SELECT * FROM authors . COMMIT TRANSACTION,4.定制锁定提示,可以使用 SELECT、INSERT、UPDATE 和 DELETE 语句指定表级锁定提示的范围,以引导SQL Server使用所需的锁类型。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁定提示。这些锁定提示取代了会话的当前事务隔离级别。,示例,将事务隔离级别设置为SERIALIZABLE,并且在SELECT语句中使用表级锁定提示NOLOCK。 USE pubs GO SET TRANSACTION ISOLATION LEVEL SERIALIZABLE GO BEGIN TRANSACTION SELECT au_lname FROM authors WITH (NOLOCK) GO,

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

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号