清华大学数据库access课件 第11章:并发控制



《清华大学数据库access课件 第11章:并发控制》由会员分享,可在线阅读,更多相关《清华大学数据库access课件 第11章:并发控制(55页珍藏版)》请在文档大全上搜索。
1、2022-6-11第第1111章并发控制章并发控制事务最基本的特性之一就是隔离性。当DBMS中有多个事务并发执行时,事务的隔离性就不一定能保持。DBMS必须对并发事务之间的相互作用加以控制,这种控制是通过来实现的。所谓的并发控制机制本质上就是并发控制协议,这些协议是一组规则,用来决定冲突的事务是回滚重启还是等待执行。本章要讨论的所有协议都本章要讨论的所有协议都能保证调度是可串行化的能保证调度是可串行化的!封锁协议封锁协议有效性检查协议有效性检查协议死锁处理死锁处理树形协议树形协议多粒度机制多粒度机制插入与删除插入与删除时间戳排序协议时间戳排序协议多版本机制多版本机制本章总结本章总结2022-6
2、-1211.111.1封锁协议封锁协议加锁的理由保证调度可串行化的方法之一是对数据项的访问以互斥的方式进行: 当一个事务访问某个数据项时,其他任何事务都不能修改该数据项。实现这个要求的最常用的方法就是: 只有当一个事务目前在一个数据项上持有某种锁时,DBMS才允许该事务访问这个数据项; 否则,就2022-6-1311.111.1封锁协议封锁协议给数据项加锁的类型 共享锁: 如果事务T获得了数据项Q上的共享锁(记为S),则T可读Q但不能写Q。 排他锁: 如果事务T获得了数据项Q上的排他锁(记为X),则T既可读Q又可写Q。根据操作要求事务给数据项申请适当的锁 该请求是发送给DBMS的并发控制管理器
3、的; 只有在并发控制管理器授予事务所需要的锁之后,事务才能继续其操作。2022-6-1411.111.1封锁协议封锁协议一个数据项上到底能加有多少个锁?锁和锁之间的关系是什么? 令A与B代表任意类型的锁,已知如下条件: 事务Ti正请求对数据项Q加A类型锁; 而另一个事务Tj当前在数据项Q上持有B类型锁。 结论: 尽管数据项Q上已加有B类型锁,但如果事务Ti可以立即获得数据项Q上的A类型锁,则称A类型锁与B类型锁相容。锁相容矩阵 只有其值为TRUE的两类锁才相容。2022-6-1511.111.1封锁协议封锁协议基本的封锁协议 加锁: 要访问一个数据项,事务T必须首先申请给该数据项加锁:如果该数
4、据项已经被另一事务加上了不相容类型的锁,则在所有不相容类型的锁被释放之前,并发控制管理器不会授予事务T申请的锁;因此T必须等待,直到所有不相容类型的锁被释放。 解锁: 只要事务T还在访问某数据项,它就必须拥有该数据项上的锁; 除此之外,事务T可以随时释放随时释放先前它加在某个数据项上的锁。2022-6-1611.111.1封锁协议封锁协议加锁与解锁的表达假设Q代表数据项加锁指令: lock-S(Q):申请Q上的共享锁; lock-X(Q):申请Q上的排他锁。解锁指令: unlock(Q):释放Q上的所有锁。2022-6-1711.111.1封锁协议封锁协议带锁的调度 事务T1申请锁 并发控制管
5、理器检查是否可以授予锁? 如果可以,grant-X(A,T1)指令将授予锁 如果不可以,则事务T1就必须等待!2022-6-1811.111.1封锁协议封锁协议基本封锁协议的问题 从前面的例子可以看出,即使在调度中采用了基本的封锁协议,也还有可能导致数据库不一致。因此基本的封锁协议也有缺陷: 解锁问题: 在事务中过早地释放数据项上的锁,有可能导致数据库的不一致。 死锁问题: 所有的事务因为持有锁和申请锁而导致大家都处于等待状态,无法继续执行; 饿死问题: 一个事务总是不能在某个数据项上加上锁,因此该事务也就永远不能取得进展。2022-6-1911.111.1封锁协议封锁协议解锁与死锁问题 如果
6、对数据项进行读写之后立即解锁,容易造成数据库的不一致,那么是否把解锁的时机往后推到事务的末尾就万事大吉了呢? 解锁的时机不仅影响事务的并发度,同时还有可能造成调度的死锁! 死锁比造成数据库不一致要好,因为死锁可以通过DBMS回滚某事务加以解决;而2022-6-11011.111.1封锁协议封锁协议饿死问题 锁的授予:事务申请对某数据项加某种类型的锁;没有其他事务在该数据项上持有与该事务所申请的锁不相容的锁;此时,并发控制管理器才可以授予锁。当事务Ti申请对数据项Q加M型锁时,授权加锁的条件是:不存在其他事务在数据项Q上持有与M型锁冲突的锁;不存在其他事务等待对数据项Q加锁且先于Ti申请加锁。2
7、022-6-111两阶段封锁协议 为了解决事务的解锁问题,该协议要求每个事务分两个阶段提出加锁和解锁申请: 增长阶段:事务可以获得锁,但不能释放锁。 缩减阶段:事务可以释放锁,但不能获得锁。 对于一个事务而言:11.111.1封锁协议封锁协议2022-6-11211.111.1封锁协议封锁协议两阶段封锁协议 饿死问题: DBMS中并发控制管理器授权加锁的两个条件。 解锁问题: 两阶段封锁协议指出了事务释放锁的时机,使得解锁指令不必非得出现在事务的末尾,增加了事务之间的并发度。 死锁问题: 在调度中可能还会有死锁发生,真正的原因是什么呢?2022-6-113封锁点 对任何一个事务而言,在调度中获
8、得其最后一个锁的时刻,称为该事务的封锁点。思考题 调度中多个事务可根据它们的封锁点进行排序,该顺序就是事务的一个可串行化次序?11.111.1封锁协议封锁协议2022-6-114加强的两阶段封锁协议 问题的提出: 在两阶段封锁协议下,还有一个问题就是在发生故障的情况下调度中事务的级联回滚可能发生。 举例: 如右图所示11.111.1封锁协议封锁协议2022-6-115加强的两阶段封锁协议 严格两阶段封锁协议: 除了要求封锁是两阶段之外,还要求事务持有的所有排他锁必须在事务提交之后方可释放; 这个要求保证未提交事务所写的任何数据在该事务提交之前均以排他方式加锁,防止其他事务读取这些数据。 强两阶
9、段封锁协议: 该协议要求事务提交之前不得释放任何锁,它旨在让冲突的事务尽可能地串行执行; 这样调度中的事务可以按其提交的顺序串行化; 事务提交的顺序与前面讲的封锁点顺序一致吗?11.111.1封锁协议封锁协议2022-6-116锁的转换 问题的提出: 如果事务一开始就申请排他锁并获得该锁,那么其他事务只能在该事务提交之后才有可能获得锁而继续执行; 也就是说,加强的两阶段封锁协议虽然保证了调度不会发生级联回滚,但却降低了事务之间的并发度。 举例: 事务T12必须对数据项a1加排他锁,结果导致11.111.1封锁协议封锁协议2022-6-117锁的转换 问题的解决: 事实上,只是在T12写a1的时
10、候才需要对a1加排他锁; 因此,一开始T12只要对a1加共享锁就可以,只是在需要时再将其变为排他锁,这样T12和T13就可以真正地实现并发执行。 锁的升降级: upgrade表示将共享锁升级为排他锁,只能发生在 downgrade表示将排他锁降级为共享锁,只能发生在11.111.1封锁协议封锁协议2022-6-118商用DBMS中封锁协议的实现 在实际的商用DBMS中,根据加强的封锁协议实现的并发控制机制很简单且被广泛采用; 这样的机制能保证并发控制管理器自动为事务产生加锁、解锁指令: 当事务T进行read(Q)操作时,系统产生lock-S(Q)指令,后接read(Q)指令; 当事务T进行wr
11、ite(Q)操作时,系统检查T是否已在Q上持有共享锁:若有,则系统发出upgrade(Q)指令,后接write(Q)指令;否则系统发出lock-X(Q)指令,后接write(Q)指令; 事务提交或回滚后,该事务持有的锁都被释放。11.111.1封锁协议封锁协议2022-6-119事务冲突 封锁协议要求事务在操作数据前,必须向并发控制管理器申请锁: 如果事务没有立刻申请到相关的锁,就说明系统中有冲突的事务,它必须等待。 系统中并发的事务之间存在哪些冲突?这些冲突会造成哪些问题(数据库不一致)? 写读冲突:读未提交的数据,即脏读; 读写冲突:不可重复读; 写写冲突:重写未提交的数据,即丢失修改;