当前课程知识点:数据库概论 >  第八章 事务处理 >  8.4 两阶段封锁 >  两段锁协议

返回《数据库概论》慕课在线视频课程列表

两段锁协议在线视频

两段锁协议

下一节:隔离级别

返回《数据库概论》慕课在线视频列表

两段锁协议课程教案、知识点、字幕

同学们好

我是来自云南大学软件学院的包崇明

下面为大家介绍两阶段封锁协议

封锁是多用户环境中

最常采用的一种并发控制技术

一个事务访问数据库中的数据时

在被访问的数据对象上面进行封锁

可限制其它事务对该数据对象的访问

从而保证数据访问

操作的正确性和一致性

封锁可以在一段时间内

禁止其它事务在被封锁的数据对象上

执行某些类型的操作

也表明持有该封锁的事务

在被封锁的数据对象上

将要执行什么类型的操作

常用的封锁类型有两种

一类称为写锁

也称为排它锁

我们用WL(Write Lock)表示

一类称为读锁

也称为共享锁

我们用RL(Read Lock)表示

如果一个事务T

申请在数据对象A上施加写锁WL

只有当数据对象A

没有被其它事务封锁时

才能申请成功

申请成功后

事务T可以对数据对象A

进行读和写操作

其它事务不能在数据对象A上

再施加任何类型的封锁

被禁止访问数据对象A

写锁能够让事务T独占该数据对象A

从而保证了事务T

对数据对象A的访问操作的正确性和一致性

但降低了整个系统的并发性

对于事务何时释放所持有的写锁

一般来说

写锁需要在事务结束的时候才能释放

如果事务T申请在数据对象A上

施加读锁RL

只有数据对象A上

没有被其它事务封锁

或者其它事务仅仅持有

数据对象A的读锁时

才能申请成功

读锁申请成功后

事务T可以对数据对象A进行读操作

但不能进行写操作

而其它事务

还可以对数据对象A施加读锁

我们看到多个事务

所申请的读锁

可以共存于同一个数据对象A上

从而保证了多个事务

可以同时读数据对象A

有利于提高整个系统的并发性

在持有封锁的事务

释放数据对象A上的所有读锁之前

任何事务都不能写数据对象A

读锁则不必等到事务结束才释放

我们知道调度器的工作

是把一个由交错读写操作组成的经历

经过调度后

使其等价于一个串行经历

调度器采用的方法

是使某些事务操作等待

让其它一些事务操作先执行

来达到这一目标

使最终产生的经历是可串行化的

虽然调度器可以采用

让一个事务的所有操作执行完

再顺序执行下一个事务的所有操作

这样简单的串行调度

来保证经历的可串行化

但从系统性能的角度看

这种串行调度是非常不可取的

导致系统的可行性大大降低

下面我们讲解调度器

是如何通过加锁机制

将一个交错读写操作组成的经历

调度为可串行化的

我们要学习的是在数据库系统中

用来保证事务一致性的

一个非常著名的锁机制

称为两阶段锁协议

缩写为2PL

两阶段锁协议定义了下面三条规则

用来规定调度过程中如何申请和释放锁

规则一

当事务Ti试图读取某个数据项A时

调度器代表该操作向A加读锁

同样

当事务Ti试图对A进行写操作时

调度器代表该操作向A加写锁

也就是说

不管是读操作还是写操作

执行之前都需要先加锁

再进行读写操作

规则二

在获得某个数据项封锁之前

调度器要求事务处于等待状态

直到该数据项上没有冲突锁存在

也就是说

成功申请到锁后事务操作才能继续执行

一个数据项上存在冲突锁

是指其他事务已经持有该数据项的封锁

而一个事务

正试图申请该数据项的一个封锁

这些封锁中至少一个为写锁

联系前面学习的冲突操作

就容易理解冲突锁

规则三

加锁分为两个阶段

加锁阶段和释放锁阶段

在加锁阶段

事务获得所要求的锁

释放锁阶段事务释放拥有的锁

调度器必须保证一旦释放阶段开始

就不再允许该事务再申请新的锁

也就是一个事务释放了某个锁之后

就不能再申请其它任何封锁

这也是两阶段锁协议名称的由来

加锁的时候

一个事务不会和它持有的锁冲突

如果事务已经申请到数据项A的读锁

后面它想申请A的写锁

当没有其它的事务持有A的读锁时

事务可成功申请到对A的写锁

如果事务已经获得A的写锁

读A时它不需要申请读锁

或者可以随时获得A的读锁

也就是说

一个事务中的锁永远不会冲突

调度器按照两阶段锁协议进行调度后

任何交错执行经历都可调度为一个

可串行化的经历

这是因为两阶段锁协议

尽量保证前趋图中不会出现环

事务T对数据项A加锁后

迫使后面试图对A加锁的其它事务

在T之后执行

如果出现两个事务

互相持有对方所需要的锁

这意味着前趋图中出现了环

在规则2(等待规则)中意味着

两个事务将相互等待

我们称这种情况为死锁(Deadlock)

出现死锁时

调度器会根据相应策略

撤销其中一个事务

让其释放所有持有的封锁后

重新进行调度

下面我们以一个例子说明

调度器按两阶段锁协议

进行调度的工作流程

经历H4由八个操作组成

事务T1读A

事务T2读A

事务T2写A

事务T2读B

事务T2写B

事务T1读B

最后T1和T2顺序提交

从这个经历中

我们可找到两个冲突操作对

操作1和操作3冲突

操作5和操作6冲突

根据前面所学知识

我们可知

经历H4不是可串行化的

现在我们采用两阶段锁协议来调度它

首先T1读A

调度器为该操作对A加读锁

由于A上面目前没有任何锁

加锁成功

T1执行读A操作

下一个操作是T2读A

调度器对A加读锁

A上已有T1施加的读锁

为T2加读锁不会造成锁冲突

加锁成功

T2执行了读A操作

接着T2准备写A

调度器为T2加A的写锁

由于A上有T1施加的读锁

出现了锁冲突

按照规则二

事务T2必须等待

执行操作4

T2读B

但由于T2处于等待状态

执行操作5

操作5是T2写B

同样由于T2处于等待状态

所以执行操作6

操作6是T1读B

调度器代表T1申请到B的读锁

T1执行读B

操作7是

T1提交并释放T1在A和B上面的读锁

T2在操作3处于等待状态

这时数据A上只有T2的读锁

调度器代表T2成功对A加上写锁

操作3执行

接着处于等待状态的操作4和操作5

也加锁成功依次成功执行

最后T2提交

两个事务成功执行

我们可看到

经过调度器按照两阶段锁协议

进行调度后

一个不是可串行化的经历

H4最终成为了可串行化的

今天的课就到这里

同学们再见

数据库概论课程列表:

导论

-数据库概述

--Video

-导论--数据库概述

第一章 数据库基础

-1.1 数据库基础

--Video

-第一章 数据库基础--1.1 数据库基础

第二章 关系运算

-2.1 CAP数据库

--CAP数据库

-第二章 关系运算--2.1 CAP数据库

-2.2 自然关系运算1

-- 自然关系运算1

-第二章 关系运算--2.2 自然关系运算1

-2.3 自然关系运算2

--自然关系运算2

-第二章 关系运算--2.3 自然关系运算2

第三章 结构化查询语言SQL

-3.1 SQL概述

-- SQL概述

-3.1 SQL概述--作业

-3.2 数据定义DDL

--数据定义DDL

-3.2 数据定义DDL--作业

-3.3 SQL数据更新DML

--SQL数据更新DML

-3.3 SQL数据更新DML--作业

-3.4 复杂SQL查询操作1

--复杂SQL查询操作1

-第三章 结构化查询语言SQL--3.4 复杂SQL查询操作1

-3.5 复杂SQL查询操作2

--复杂SQL查询操作2

-第三章 结构化查询语言SQL--3.5 复杂SQL查询操作2

第四章 数据库完整性、视图与安全性

-4.1 数据完整性

--4.1 数据完整性

-4.1 数据完整性--作业

-4.2 完整性约束

--完整性约束

-4.2 完整性约束--作业

-4.3 外键约束

--外键约束

-4.3 外键约束--作业

-4.4 触发器

--触发器

-4.4 触发器--作业

-4.5 视图

--视图

-4.5 视图--作业

-4.6 安全性

--安全性

-4.6 安全性--作业

第五章 索引

-5.1 索引

--Video

-5.2 B+树索引

--Video

第六章 规范化理论

-6.1 函数依赖

--Video

-6.2 Armstrong公理

--Video

-6.3 无损分解

--Video

-6.4 范式举例

--Video

-6.5 三种范式

--Video

-6.5 三种范式--作业

第七章 实体关系模型

-7.1-E-R模型概述

--E-R模型概述

-7.2 E-R模型详解

--Video

-7.3 E-R模型的拓展

--Video

-7.4 E-R模型实例分析

--Video

第八章 事务处理

-8.1 事务的ACID性质介绍

--ACID介绍

-8.1 事务的ACID性质介绍--作业

-8.2 事务经历

--事务经历

-8.2 事务经历--作业

-8.3 可串行化调度和前趋图

--可串行化调度和前趋图

-8.3 可串行化调度和前趋图--作业

-8.4 两阶段封锁

--两段锁协议

-8.4 两阶段封锁--作业

-8.5 隔离级别

--隔离级别

-8.5 隔离级别--作业

-8.6 事务恢复

--事务恢复

-8.6 事务恢复--作业

第九章 数据库应用与开发

-9.1 数据库使用介绍

--数据库使用介绍

-9.2 Java访问数据库

--Java访问数据库

-9.2 Java访问数据库--作业

第十章 其他数据库技术概述

-10.1 数据库新技术概述

--Video

两段锁协议笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。