Loading... # Ch11. 并发控制 ## 11.1 数据库为什么要并发控制;并发控制技术能保证事务的哪些特性 ### 11.1.1 数据库为什么要并发控制? 数据库是共享资源,通常由多个事务同时运行。多个事务并发存取数据库是就会产生同时读/写统一数据的情况。弱队并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。 ### 11.1.2 并发控制技术能保证事务的哪些特性 保证**一致性**和**隔离性** ## 11.2 并发操作可能会产生哪几类数据不一致;用什么方法可以避免 ### 11.2.1 并发操作可能会产生哪几类数据不一致 1. 丢失修改 2. 不可重复读 3. 读脏数据 ### 11.2.2 用什么方法可以避免 并发控制 技术有:**封锁方法、时间戳方法、乐观控制方法和多版本并发控制方法**等 ## 11.3 什么是封锁;基本的封锁类型 ### 11.3.1 封锁 封锁是事务 $T$ 对某个数据对象操作之前,现象系统发送请求,进行加锁。在事务 $T$ 释放他的锁之前,其他的事物不能更新或读取此数据对象。 ### 11.3.2 封锁类型 1. X锁 (排他锁、写锁) 2. S锁 (共享锁、读锁) ## 11.4 如何用封锁机制保证数据的一致性 DBMS在对数据进行读写操作之前首先对该数据执行封锁操作。DBMS按照一定的封锁协议对并发操作进行控制,使得多个并发操作有序的执行,可以避免丢失修改、不可重复读、和读脏数据等数据不一致性。 ## 11.5 什么是活锁;活锁产生的原因和解决方法 ### 11.5.1 什么是活锁 该等待事务等待的时间太长,似乎被锁住,实际上可能被激活, 如:事务 $T_1$ 封锁了数据 $R$,事务 $T_2$ 请求封锁 $R$, $T_2$ 进行等待。 $T_3$ 也请求封锁 $R$, 当 $T_1$ 释放了 $R$ 上的封锁首先批准了 $T_3$ 的请求, $T_2$ 继续等待。然后 $T_4$ 申请后优先批准 $T_4$, $T_2$ 可能永远等待 ### 11.5.2 产生原因 一系列封锁不能按照先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁 ### 11.5.3 解决方法 采用**先来先服务**的策略 ## 11.6 什么是死锁;预防死锁的方法 ### 11.6.1 什么是死锁 事务 $T_1$ 封锁数据 $R_1$, $T_2$ 封锁了数据 $R_2$, $T_1$ 又请求封锁 $R_2$, $T_2$ 已经封锁 $R_2$,于是 $T_1$ 等待 $T_2$ 释放 $R_2$ 上的锁。接着 $T_2$ 又申请封锁 $R_1$ ,因为 $T_1$ 已经封锁 $R_1$,于是 $T_2$ 也只能等待 $T_1$ 释放 $R_1$ 上的锁。 此时出现 $T_1$ 封锁 $T_2$,$T_2$ 封锁 $T_1$,两个事务永远无法结束,形成死锁。 ### 11.6.2 预防死锁的若干方法 1. 一次封锁法 2. 顺序封锁法 ## 11.7 检测死锁地方法,发生后如何解除 ### 11.7.1 检测死锁的方法 一般采用的方法是:允许死锁发生,DBMS检测到死锁后加以解除 ### 11.7.2 解除死锁的方法 **超时法**和**事务等待图法** ## 11.8 什么用的并发调度是正确的调度 **可串行化**的调度是正确的调度 **可串行化的定义**:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行他们时结果相同,称这种调度策略为可串行化的调度 ## 11.9 两段锁协议 *(2PL协议)* ### 11.9.1 2PL协议的两个阶段 1. 第一阶段时**获得封锁**,又称为扩展阶段。这个阶段,事务可以申请获得任何数据项上的任何类型的锁 2. 第二阶段时**释放封锁**,又称为收缩阶段。这个阶段,事务可以释放任何数据项上的任何类型的锁,但是**不能再申请任何锁** ### 11.9.2 证明: 若并发执行的所有事务均遵守2PL协议,则对这些事务的任何并发调度策略都是可串行化的 > **Note** > > - 事务遵守2PL是可串行化调度的**充分条件**,而非必要条件 设存在2个并发事务 $T_1$, $T_2$ 根据可串行化定义,事务不可串行化仅且存在以下两种情况 - $(1)$: 当事务 $T_1$ 写某个数据对象 $A$, 事务 $T_2$ 读/写 $A$ - $(2)$: 当事务 $T_1$ 读/写某个数据对象 $A$, 事务 $T_2$ 写 $A$ 令 $A$ 为潜在冲突对象 设 $T_1$, $T_2$ 访问的潜在冲突的公共对象为 $\{A_1,A_2,\cdots,A_n\}$ 假设这组潜在冲突对象中, - $X=\{A_1,A_2,\cdots,A_i\}$ 符合 $(1)$ - $Y=\{A_{i+1},A_{i+2},\cdots,A_n\}$ 符合 $(2)$ 且 $\forall x \in X$, 存在 - $(a)$: $T_1$ 需要 ``XLOCK x`` - $(b)$: $T_2$ 需要 ``SLOCK x`` 或 ``XLOCK x`` 对于 $(1)$: 若 $(a)$ 先执行, 则 $T_1$ 获得锁, $T_2$ 等待 由于遵守2PL协议, $T_1$ 在成功获得 $X$, $Y$ 中全部对象及非潜在冲突对象的锁后, 才会释放锁 若此时 $\exists w \in X$ 或 $\exists w \in Y$, $T_2$ 已获得 $w$ 的锁, 则出现死锁; 否则 $T_1$ 在对 $X$, $Y$ 中对象处理完毕后, $T_2$ 才能执行,相当于 $T_1$, $T_2$ 的顺序串行执行 对于 $(2)$: $(b)$ 先执行的情况与 $(1)$ 对称 综上, 若并发执行的所有事务均遵守2PL协议, 在这些并发事务不发生死锁的情况下, 这些事务的并发一定是可串行化的 证毕. ## 11.10 考虑如下的调度,说明这些调度集合之间的包含关系 1. 正确的调度 2. 可串行化的调度 3. 遵循2PL协议的调度 4. 串行调度 $3 \subset 1 = 2$ $4 \subset 1$ ## 11.11 为什么要引进意向锁;意向锁的含义是什么 ### 11.11.1 为什么要引进意向锁 引进意向锁是为了提高封锁子系统的效率 ### 11.11.2 意向锁的含义是什么 对任一节点加锁时,必须先对它的上层节点加意向锁。引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级节点的封锁冲突了 ## 11.12 描述常用的意向锁,并给出这些锁的相容矩阵 ### IS锁 若对数据对象加IS锁,表示它的后裔节点拟(意向)加S锁。 例如:要对某个元组加S锁,则首先要对关系和数据库加IS锁 ### IX锁 若对数据对象加IX锁,表示它的后裔节点拟(意向)加X锁。 例如:要对某个元组加X锁,则首先要对关系和数据库加IX锁 ### SIX锁 若对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX ### 相容矩阵 | T1\T2 | S | X | IS | IX | SIX | - | | :-: | :-: | :-: | :-: | :-: | :-: | :-: | | S | Y | N | Y | N | N | Y | | X | N | N | N | N | N | Y | | IS | Y | N | Y | Y | Y | Y | | IX | N | N | Y | Y | N | Y | | SIX | N | N | Y | N | N | Y | | - | Y | Y | Y | Y | Y | Y | 最后修改:2020 年 11 月 01 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏