虽然写这个博客主要目的是为了给我自己做一个思路记忆录,但是如果你恰好点了进来,那么先对你说一声欢迎。我并不是什么大触,只是一个菜菜的学生,如果您发现了什么错误或者您对于某些地方有更好的意见,非常欢迎您的斧正!
目录
②意向排它锁(Intent Exclusive Lock,简称IX锁)
√多用户数据库系统:允许多个用户同时使用同一个数据库的数据库系统。
(1)事务串行执行
√每个时刻只有一个事务运行,其它事务必须等到这个事务结束以后方能运行
√不能充分利用系统资源,发挥数据库共享资源的特点
(2) 交叉并发方式
√在单处理机系统中,事务的并行执行是这些并行事务的并行操作轮流交叉运行
√单处理机系统中的并行事务并没有真正地并行运行,但能够减少处理机的空闲时间,提高系统的效率
(3) 同时并发方式
√多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行
11.1并发控制的概述
√事务并发执行带来的问题
·会产生多个事务同时存取同一数据的情况
·可能会存取和存储不正确的数据,破坏事务隔离性和数据库的一致性
√并发操作带来的数据不一致性包括丢失修改、不可重复读和读“脏”数据
①丢失修改(lose update)
√如a所示,两个事务与
同时读入同一数据并修改,
提交的结果破坏了
提交的结果,导致
的修改被丢失。
②不可重复读(non-repeatable read)
1)事务 读取某一数据后(在后续操作还没有完成之前),事务
对其做了修改,当事务
再次读该数据时,得到与前一次不同的值。
2)事务按一定条件从数据库中读取了某些数据记录后,事务
删除了其中部分记录,当
再次按相同条件读取数据时,发现某些记录消失了 ;
3)事务按一定条件从数据库中读取某些数据记录后,事务
插入了一些记录,当
再次按相同条件读取数据时,发现多了一些记录。
√后两种不可重复读有时也称为幻影现象
③读“脏”数据(dirty read)
√事务修改某一数据后将其写回磁盘(还没完事),事务
读取同一数据后,事务
出于某种原因被撤销,
就恢复了之前的值,那么
读到的就是一个错误的数据(“脏”数据)。
√并发控制机制的任务
·保证事务的隔离性
·对并发操作进行正确调度
·保证数据库的一致性
√并发控制的主要技术
·封锁(Locking)
·时间戳(Timestamp)
·乐观控制法
√商用的DBMS一般都采用封锁方法
11.2封锁
(可不看)√看这个名字就知道,就是在干事情的时候,把数据封锁一下,这样
就不能对这些胡作非为了,就保证了不会出错。
正文:
√封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其封锁;
√加锁后事务T就对该数据对象有了一定的控制,在事 务T释放它的锁之前,其它的事务不能更新此数据对象。
√一个事务对某个数据对象加锁后究竟拥有什么样的控制由封锁的类型决定
√基本封锁类型
·排它锁(Exclusive Locks,简记为X锁)
·共享锁(Share Locks,简记为S锁)
排他锁
√若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁
√保证其他事务在 T 释放 A 上的锁之前不能再读取和修改A
共享锁
√共享锁又称读锁
√若事务 T 对数据对象 A 加上 S 锁,则其它事务只能再对 A 加 S 锁(只读),而不能加 X 锁,直到 T 释放 A 上的 S 锁
√保证其他事务可以读 A,但在 T 释放 A 上的 S 锁之前不能对 A 做任何修改
√Y 相容的请求, N 不相容的请求
√最左边一列表示事务T1已经获得的数据对象上的锁的类型,其中横线表示没有加锁
√最上面一行表示另一事务T2对同一数据对象发出的封锁请求
√T2的封锁请求能否被满足用矩阵中的Y和N表示
·Y 表示事务封锁锁相容,封锁请求可以满足
·N 表示封锁请求冲突,封锁请求被拒绝
11.3封锁协议
①一级封锁协议
√事务T在修改数据 A 之前,先对其加 X 锁,直到事务结束才释放
②二级封锁协议
√事务T在读数据A之前,先对其加S锁,读完后释放
③三级封锁协议
√在一级封锁协议的基础上,事务T在读数据A之前,先对其加S锁,直到事务结束后释放
| X锁 | S锁 | 一致性保证 | ||||
操作结束释放 | 事务结束释放 | 操作结束释放 | 事务结束释放 | 不丢失修改 | 不读脏数据 | 可重复读 | |
一级 |
| √ |
|
| √ |
|
|
二级 |
| √ | √ |
| √ | √ |
|
三级 |
| √ |
| √ | √ | √ | √ |
| X锁 | S锁 | 一致性保证 | ||||
操作结束释放 | 事务结束释放 | 操作结束释放 | 事务结束释放 | 不丢失修改 | 不读脏数据 | 可重复读 | |
一级 |
| √ |
|
| √ |
|
|
二级 |
| √ | √ |
| √ | √ |
|
三级 |
| √ |
| √ | √ | √ | √ |
11.4活锁和死锁
活锁
√活锁:(排队的时候你前面有个人A,A结束了,B插到你前面,B结束了C插到你前面,你就要一直等)
·事务T1封锁了数据R
·事务T2又请求封锁R,于是T2等待。
·T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。
·T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求……
·T2有可能永远等待,这就是活锁的情形
√避免活锁:采用先来先服务的策略 (不准插队策略)
·当多个事务请求封锁同一数据对象时
·按请求封锁的先后次序对这些事务排队
·该数据对象上的锁一旦释放,首先批准申请队列中第一个事务获得锁
死锁
√死锁:(甲和乙画画都需要笔A和笔B(每种都只有一支),甲先用笔A画了一点,锁定了笔A;同时乙先用笔B画了一点,锁定了笔B;这时候,甲想用笔B,乙想用笔A,双方都在对方画完,就陷入了无限等待)
·多个事务因竞争资源而出现的互相等待现象
√死锁的预防:一次封锁法
·要求每个事务必须一次将所有要使用的数据全部加锁,否则不能继续执行
·这显然不可行,首先很难确定一次性要用哪些,其次降低了系统的并发度。
√死锁的诊断与解除
①超时法:如果一个事务的等待时间超过了限定的时限,就认为发生了死锁。
·很难控制设定时间。
②等待图法:有向图形成了循环就认为发生了死锁。
11.5并发调度的可串行性
11.5.1可串行化调度
√定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同,这种调度策略称为可串行化(serializable)调度。
√可串行性(Serializability):并发事务正确调度的准则。一个给定的并发调度,当且仅当它是可串行化的,才认为是正确调度
11.5.2冲突可串行化调度
√冲突操作:不同的事务对同一个数据的读写操作和写写操作(其它操作不是冲突操作)
·不同事务的冲突操作和同一事务的两个操作不能交换(Swap)
·一个要读,一个要写
·两个都要写
√下图运行顺序:
·先分别读A、B并将其值赋给X、Y
·再分别利用X、Y代替A、B进行运行
·最后A、B都是3
√可串行化调度的充分条件
·一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc',如果Sc'是串行的,称调度Sc为冲突可串行化的调度
·一个调度是冲突可串行化,一定是可串行化的调度
11.6两段锁协议
√两段锁协议(Two-Phase Locking,简称2PL):指所有事务必须分两个阶段对数据项加锁和解锁
·在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁;
·在释放一个封锁之后,事务不再申请和获得任何其他封锁。
√“两段”锁的含义——事务分为两个阶段
·第一阶段是获得封锁,也称为扩展阶段
事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁
·第二阶段是释放封锁,也称为收缩阶段
事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁
√定理:若并发的事务都遵守2PL, 则这些事务的任何并发调度都是可串行化的
√一次封锁法必定是遵守2PL的
·一次封锁法可以避免死锁的发生,遵守2PL是可能发生死锁的
√严格两段锁协议:除要求满足两段锁协议规定外,还要求事务的排它锁必须在事务提交之后释放→避免脏读问题
√强两段锁协议:两段锁协议的另一个变化,除要求满足两段锁协议规定外,还要求事务的所有锁都必须在事务提交之后释放→事务可按其提交的顺序串行化
11.7封锁的粒度
√封锁对象的大小称为封锁粒度(Granularity)
√封锁的对象:逻辑单元,物理单元
·逻辑单元:属性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等
·物理单元:页(数据页或索引页)、物理记录等
√选择封锁粒度原则:封锁粒度与系统的并发度和并发控制的开销密切相关
·封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小;
·封锁的粒度越小,并发度较高,但系统开销也就越大
11.7.1多粒度封锁
√多粒度封锁(Multiple Granularity Locking):在一个系统中同时支持多种封锁粒度供不同的事务选择
√多粒度树
·以树形结构来表示多级封锁粒度
·根结点是整个数据库,表示最大的数据粒度
·叶结点表示最小的数据粒度
·允许多粒度树中的每个结点被独立地加锁
·对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁
·在多粒度封锁中一个数据对象可能以两种方式封锁:显示封锁和隐式封锁
·【例】三级粒度树:根结点为数据库,数据库的子结点为关系,关系的子结点为元组
√显式封锁和隐式封锁(效果一样)
·显式封锁: 直接加到数据对象上的封锁
·隐式封锁: 该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁
√对某个数据对象加锁,系统要检查
①该数据对象:有无显式封锁与之冲突
②所有上级结点:检查本事务的显式封锁是否与该数据对象上的隐式封锁冲突:(由上级结点已加的封锁造成的)
③所有下级结点:看上面的显式封锁是否与本事务的隐式封锁(将加到下级结点的封锁)冲突
11.7.2意向锁
√引进意向锁(intention lock)目的:提高对某个数据对象加锁时系统的检查效率
·如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁
·对任一结点加基本锁,必须先对它的上层结点加意向锁
①意向共享锁(Intent Share Lock,简称IS锁)
√如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。
·例如:事务T1要对R1中某个元组加S锁,则要首先对关系R1和数据库加IS锁
②意向排它锁(Intent Exclusive Lock,简称IX锁)
√如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。
·例如:事务T1要对R1中某个元组加X锁,则要首先对关 系R1和数据库加IX锁
③共享意向排它锁(Share Intent Exclusive Lock,简称SIX锁)
√如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX = S + IX。
·例如:对某个表加SIX锁,则表示该事务要读整个表(所以要 对该表加S锁),同时会更新个别元组(所以要对该表加IX锁)。
√锁的强度:它对其他锁的排斥程度
√一个事务在申请封锁时以强锁代替弱锁是安全的,反之则不然
√具有意向锁的多粒度封锁方法:
·申请封锁时应该按自上而下的次序进行
·释放封锁时则应该按自下而上的次序进行
·提高了系统的并发度
·减少了加锁和解锁的开销
·在实际的数据库管理系统产品中得到广泛应用
·例:事务 T1 要对关系 R1 加 S 锁
要首先对数据库加IS锁
检查数据库和R1是否已加了不相容的锁(X或IX)
不再需要搜索和检查R1中的元组是否加了不相容的锁(X锁)