文档介绍:第11章 并发控制
讲课内容:
事务最基本的特性之一就是隔离性。当DBMS中有多个事务并发执行时,事务的隔离性就不一定能保持。DBMS必须对并发事务之间的相互作用加以控制,这种控制是通过并发控制机制来实现的。所谓的并发控制机制本质上就是并发控制协议,这些协议是一组规则,用来决定冲突的事务是回滚重启还是等待执行。本章要讨论的所有协议都能保证调度是可串行化的!
■ ■有效性检查协议 ■死锁处理
■树形协议 ■多粒度机制 ■插入与删除
■时间戳排序协议 ■多版本机制 ■本章总结
1
2021/7/15
§
加锁的理由
保证调度可串行化的方法之一是对数据项的访问以互斥的方式进行:
当一个事务访问某个数据项时,其他任何事务都不能修改该数据项。
实现这个要求的最常用的方法就是:
只有当一个事务目前在一个数据项上持有某种锁时,DBMS才允许该事务访问这个数据项;
否则,就……
2
2021/7/15
§
给数据项加锁的类型
共享锁:
如果事务T获得了数据项Q上的共享锁(记为S),则T可读Q但不能写Q。
排他锁:
如果事务T获得了数据项Q上的排他锁(记为X),则T既可读Q又可写Q。
根据操作要求事务给数据项申请适当的锁
该请求是发送给DBMS的并发控制管理器的;
只有在并发控制管理器授予事务所需要的锁之后,事务才能继续其操作。
3
2021/7/15
§
一个数据项上到底能加有多少个锁?
锁和锁之间的关系是什么?
令A与B代表任意类型的锁,已知如下条件:
事务Ti正请求对数据项Q加A类型锁;
而另一个事务Tj当前在数据项Q上持有B类型锁。
结论:
尽管数据项Q上已加有B类型锁,但如果事务Ti可以立即获得数据项Q上的A类型锁,则称A类型锁与B类型锁相容。
锁相容矩阵
只有其值为TRUE的两类锁才相容。
4
2021/7/15
§
基本的封锁协议
加锁:
要访问一个数据项,事务T必须首先申请给该数据项加锁:
如果该数据项已经被另一事务加上了不相容类型的锁,则在所有不相容类型的锁被释放之前,并发控制管理器不会授予事务T申请的锁;
因此T必须等待,直到所有不相容类型的锁被释放。
解锁:
只要事务T还在访问某数据项,它就必须拥有该数据项上的锁;
除此之外,事务T可以随时释放先前它加在某个数据项上的锁。
5
2021/7/15
§
加锁与解锁的表达
假设Q代表数据项
加锁指令:
lock-S(Q):申请Q上的共享锁;
lock-X(Q):申请Q上的排他锁。
解锁指令:
unlock(Q):释放Q上相应的锁。
6
2021/7/15
§
带锁的调度
事务T1申请锁
并发控制管理器检查是否可以授予锁?
如果可以,grant-X(A,T1)指令将授予锁
如果不可以,则事务T1就必须等待!
7
2021/7/15
§
基本封锁协议的问题
从前面的例子可以看出,即使在调度中采用了基本的封锁协议,也还有可能导致数据库不一致。因此基本的封锁协议也有缺陷:
解锁问题:
在事务中过早地释放数据项上的锁,有可能导致数据库的不一致。
死锁问题:
所有的事务因为持有锁和申请锁而导致大家都处于等待状态,无法继续执行;
饿死问题:
一个事务总是不能在某个数据项上加上锁,因此该事务也就永远不能取得进展。
8
2021/7/15
§
解锁与死锁问题
如果对数据项进行读写之后立即解锁,容易造成数据库的不一致,那么是否把解锁的时机往后推到事务的末尾就万事大吉了呢?
解锁的时机不仅影响事务的并发度,同时还有可能造成调度的死锁!
死锁比造成数据库不一致要好,因为死锁可以通过DBMS回滚某事务加以解决;而…
9
2021/7/15
§
饿死问题
锁的授予:
事务申请对某数据项加某种类型的锁;
没有其他事务在该数据项上持有与该事务所申请的锁不相容的锁;
此时,并发控制管理器才可以授予锁。
当事务Ti申请对数据项Q加M型锁时,授权加锁的条件是:
①不存在其他事务在数据项Q上持有与M型锁冲突的锁;
②不存在其他事务等待对数据项Q加锁且先于Ti申请加锁。
10
2021/7/15