当前课程知识点:数据库系统原理与开发 >  第5章 数据库管理 >  5.3 并发控制 >  5.3.2 并发控制-2

返回《数据库系统原理与开发》慕课在线视频课程列表

5.3.2 并发控制-2在线视频

下一节:5.4.1 安全管理-1

返回《数据库系统原理与开发》慕课在线视频列表

5.3.2 并发控制-2课程教案、知识点、字幕

大家好!

我是主讲教师陆鑫

下面我们开始学习数据库课程

第5.3小节 并发控制

锁机制、控制协议、死锁、事务隔离

本节学习目标如下

1)了解数据库锁机制

2)了解并发控制协议

3)理解两阶段锁协议如何解决可串行调度问题

4)了解并发事务在运行过程中出现死锁条件

5)掌握在DBMS中如何设置事务隔离级别

下面继续学习并发事务控制

一、数据库锁机制

为了解决多个事务并发对共享数据

进行新增、更新、删除、查询带来的

数据不一致性问题

需要对共享数据进行加锁访问

在DBMS中通过将锁表机制与并发控制调度器结合

实现共享数据资源锁定访问

如下图所示

例如,当任何事务进行共享数据修改操作前

需要通过在锁表中对共享数据进行加锁处理

以禁止其它事务同时修改或删除该共享数据

当本事务修改共享数据结束

并在锁表中进行解锁处理后

其它事务才被允许修改或删除该共享数据

这样可以解决事务之间访问共享数据的相互干扰问题

1.资源锁定访问

在DBMS中通过加入锁表机制

来实现共享数据锁定访问

其加锁方式包含如下类型

排它锁定(Lock-X)

锁定后不允许其它事务对共享数据再加锁

共享锁定(Lock-S)

锁定后只允许其它事务对共享数据添加读取锁

2.资源锁定粒度

数据库锁定

粒度最大

表锁定

粒度较大

页面锁定

粒度中等

行锁定

粒度最小

锁定的粒度越大

DBMS管理就越容易

但系统并发数据处理能力就越差

锁定的粒度越小

DBMS管理就越复杂

但系统并发数据处理能力就越强

在实际应用中

需根据业务处理需求来确定各个共享资源的锁定粒度

3.资源锁定实施方式

隐式锁定

这是DBMS默认执行方式

显式锁定

加锁命令显式执行

二、基于锁机制的并发控制协议

为了实现并发事务对共享数据访问的串行化调度执行

还必须约束它们对共享数据的

操作访问必须是以互斥方式进行

这就需要用到基于数据库锁机制的并发控制协议

1.锁操作的相容性

在DBMS中事务程序在对共享数据进行访问前

可以通过施加不同类型的锁操作来实现互斥访问

但对相同数据施加多个锁操作时

需要解决锁操作的相容性问题

具体见下表所示

若一个事务对共享数据施加排它锁

其前提是该数据没有被其它事务加锁

若一个事务对共享数据施加共享锁

其前提是该数据没有被其它事务加锁或仅有共享锁存在

2.加锁协议

一级加锁协议

任何事务在修改共享数据对象之前

必须对该数据执行排它锁定指令

直到该事务处理完成

才进行解锁指令执行

一级加锁协议特点

使用一级加锁协议

可避免出现更新丢失问题

但不能解决“不可重复读取”

“脏读”等数据不一致问题

例如, 某航班空余机票数据A的当前值为100张

现有分别来自不同售票点的两个并发事务T1和T2

其中T1事务将售出1张机票

T2事务将售出2张机票

以下分别给出它们在不加锁和按一级加锁协议的

并发事务调度执行情况

见下图所示

调度1: 事务T1和事务T2不加锁共享访问数据A

它们的语句执行顺序如图a所示

执行结果A=99, 结果有错

其原因是事务并发操作访问共享数据

出现丢失更新数据问题

调度2: 事务T1和事务T2按一级加锁协议共享访问数据A

它们的语句执行顺序如图b所示

执行结果A=97, 结果正确

因此, 事务实施一级加锁协议可以解决丢失更新数据问题

二级加锁协议

在一级加锁协议基础上

针对并发事务的共享数据读操作

必须对该数据执行共享锁定指令

读完数据后即刻释放共享锁定

二级加锁协议特点

该加锁协议不但可以防止“丢失更新”的数据不一致性问题

还可防止出现脏读数据问题

但有可能会出现“不可重复读取”的数据不一致问题

例如, 假定某航班空余机票数据A的当前值为100张

现有分别来自不同售票点的两个并发事务T1和T2

其中T1事务将售出1张机票

T2事务进行机票空余数查询

以下分别给出它们在按一级加锁协议执行

和按二级加锁协议的事务调度执行情况

见下图所示

调度1: 事务T1和事务T2按一级加锁协议共享访问数据A

它们的语句执行顺序如图a所示

T2事务读取了脏数据A=99

因此, 实施一级加锁协议的事务可能出现脏数据读取问题

调度2: 事务T1和事务T2按二级加锁协议共享访问数据A

它们的语句执行顺序如图b所示

T2事务读取正确数据A=100

因此, 事务实施二级加锁协议可以解决脏数据读取问题

三级加锁协议

在一级加锁协议基础上

针对并发事务对共享数据进行读操作

必须对该数据执行共享锁定指令

直到该事务处理结束才释放共享锁定

三级加锁协议特点

该加锁协议不但可以防止“丢失更新”

“脏读”的数据不一致性问题

还可防止出现“不可重复读取”数据一致性问题

例如, 某航班空余机票数据A的当前值为100张

现有分别来自不同售票点的两个并发事务T1和T2

其中T1事务将售出1张机票

T2事务进行机票空余数查询

以下分别给出它们在按二级加锁协议执行

和按三级加锁协议的并发事务调度执行情况

见下图所示

调度1: 事务T1和事务T2按二级加锁协议共享访问数据A

它们的语句执行顺序如图a所示

T2事务首次读取A=100

T2事务再次读取A=99

因此, 实施二级加锁协议的事务可能出现不可重复读取问题

调度2: 事务T1和事务T2按三级加锁协议共享访问数据A

它们的语句执行顺序如图b所示

T2事务首次读取A=100

T2事务再次读取A=100

因此, 事务实施三级加锁协议可以解决不可重复读取问题

3.不同级别锁协议比较

通过对一级到三级加锁协议的事务处理数据结果分析

可了解它们的特点

如下表所示

一级到三级加锁协议均需事务全程施加排它锁访问共享数据

但一级加锁协议不施加共享锁

二级加锁协议仅在读取数据时施加共享锁

三级加锁协议需全程施加共享锁

一级加锁协议只解决丢失更新问题

不能解决脏读与不可重复读问题

二级加锁协议可解决丢失更新问题、脏读问题

不能解决不可重复读问题

三级加锁协议对于丢失更新问题

脏读问题、不可重复读问题均可解决

三、两阶段锁定协议

并发事务的正确调度准则

一个给定的并发事务调度

当且仅当它是可串行化时

才能保证正确调度

保证可串行化的一个协议是

二阶段锁定协议

二阶段锁定协议规定每个事务

必须分两个阶段提出加锁和解锁申请

增长阶段

事务只能获得锁, 但不能释放锁

缩减阶段

事务只能释放锁, 但不能获得新锁

下面通过一个示例来说明在事务程序中

如何实施两阶段锁定协议

该事务T符合两阶段锁定协议

可实现串行化调度

判断下列事务是否可串行化调度

事务T1加锁解锁顺序

事务T1不符合两阶段锁定协义

不可串行化

事务T2加锁解锁顺序

事务T2符合两阶段锁定协义

可串行化

结论:若并发事务执行的所有事务都遵从两阶段锁定协议

则这些事务的任何并发调度都是可串行化调度

即这些并发调度执行结果可以保证数据库一致性

四、死锁问题解决

1.事务死锁

在基于锁机制的并发事务执行中

如果这些事务同时锁定两个以及以上资源时

可能会出现彼此都不能继续执行的状态

即事务死锁状态

例如, 假定两个事务T1和T2

它们都需要加锁访问数据库表Table1和Table2

其事务程序见图6-20a所示

当这两个事务程序调度执行时

只要不是按可串行化调度执行

则它们在执行时会出现死锁状态

见图6-20b所示

事务T1和T2按照图b语句顺序执行

它们都需要加锁访问数据库表Table1和Table2

当它们均执行到第3个语句时

因都需要等待对方释放所占用资源而出现彼此

都无法再继续执行的死锁状态

2.死锁出现的必要条件

互斥条件

请求和保持条件

不剥夺条件

环路等待条件

3.防范死锁的策略

允许用户一次发出当前所需全部资源的锁定

使用完成后

再释放给其它用户访问

规定所有应用程序锁定资源的顺序必须完全相同

4.解决死锁的办法

当发生死锁时

回滚其中的一个事务

并取消它对数据库所做的操作

五、事务隔离级别

SQL标准定义了四种事务隔离级别

在DBMS系统中设置相应的事务隔离级别

可解决事务并发执行中出现的数据访问异常问题

具体见下表所示

说明:事务隔离级别设置是在DBMS中

执行SET TRANSACTION命令来实现

或通过管理工具设置

事务隔离级别设置越高

出现数据不一致的可能性越小

但系统吞吐量也越小

好了,本节学习结束!

数据库系统原理与开发课程列表:

第1章 数据库系统概论

-1.1 数据库及其系统概念

--1.1 数据库及其系统概念

-1.2 数据库技术发展

--1.2 数据库技术发展

-1.3 数据库应用系统

--1.3 数据库应用系统

-1.4 典型数据库管理系统

--1.4 典型数据库管理系统

-1.5 PostgreSQL对象-关系数据库系统软件

--1.5 PostgreSQL对象-关系数据库系统软件

-第1章 数据库系统概论--本章单元测试

-第1章 数据库系统概论--本章重点问题讨论

第2章 数据库关系模型

-2.1 关系及其相关概念

--2.1.1关系及其相关概念-1

--2.1.2关系及其相关概念-2

-2.2 关系模型原理

--2.2.1关系模型原理-1

--2.2.2关系模型原理-2

-2.3 PostgreSQL数据库关系操作实践

--2.3 PostgreSQL数据库关系操作实践

-第2章 数据库关系模型--本章单元测试

-第2章 数据库关系模型--本章重点问题讨论

第3章 数据库操作SQL语言

-3.1 SQL语言概述

--3.1 SQL语言概述

-3.2 数据定义SQL语句

--3.2.1数据定义SQL语句-1

--3.2.2数据定义SQL语句-2

--3.2.3数据定义SQL语句-3

-3.3 数据操纵SQL语句

--3.3 数据操纵SQL语句

-3.4 数据查询SQL语句

--3.4.1单表数据查询

--3.4.2 内置函数与分组统计

--3.4.3 多表关联查询

-3.5 数据控制SQL语句

--3.5 数据控制SQL语句

-3.6 视图SQL语句

--3.6 视图SQL语句

-3.7 PostgreSQL数据库SQL实践

--3.7 PostgreSQL数据库SQL实践

-第3章 数据库操作SQL语言--本章单元测试

-第3章 数据库操作SQL语言--本章重点问题讨论

第4章 数据库设计与实现

-4.1 数据库设计概述

--4.1 数据库设计概述

-4.2 E-R模型方法

--4.2.1 E-R模型方法-1

--4.2.2 E-R模型方法-2

-4.3 数据库建模设计

--4.3.1 数据库建模设计-1

--4.3.2 数据库建模设计-2

-4.4 数据库规范化设计

--4.4.1 数据库规范化设计-1

--4.4.2 数据库规范化设计-2

-4.5 数据库设计模型SQL实现

--4.5 数据库设计模型SQL实现

-4.6 基于Power Designer的数据库设计建模实践

--4.6 基于Power Designer的数据库设计建模实践

-第4章 数据库设计与实现--本章单元测试

-第4章 数据库设计与实现--本章重点问题讨论

第5章 数据库管理

-5.1 数据库管理概述

--5.1 数据库管理概述

-5.2 事务管理

--5.2 事务管理

-5.3 并发控制

--5.3.1 并发控制-1

--5.3.2 并发控制-2

-5.4 安全管理

--5.4.1 安全管理-1

--5.4.2 安全管理-2

-5.5 数据库备份与恢复

--5.5 数据库备份与恢复

-5.6 PostgreSQL数据库管理项目实践

--5.6 PostgreSQL数据库管理项目实践

-第5章 数据库管理--本章单元测试

-第5章 数据库管理--本章重点问题讨论

第6章 数据库应用编程

-6.1 数据库连接技术

--6.1.1 数据库连接技术-1

--6.1.2 数据库连接技术-2

-6.2 数据库存储过程

--6.2 数据库存储过程

-6.3 数据库触发器

--6.3 数据库触发器

-6.4 数据库游标

--6.4 数据库游标

-6.5 嵌入式SQL编程

--6.5 嵌入式SQL编程

-第6章 数据库应用编程--本章单元测试

-第6章 数据库应用编程--重点问题讨论

第7章 NoSQL数据库技术

-7.1 NoSQL数据库概述

--7.1.1 NoSQL数据库概述-1

--7.1.2 NoSQL数据库概述-2

--7.1.3 NoSQL数据库概述-3

-7.2 列存储数据库

--7.2.1列存储数据库-1

--7.2.2列存储数据库-2

-7.3 键值对数据库

--7.3.1 键值对数据库-1

--7.3.2 键值对数据库-2

--7.3.3 键值对数据库-3

-7.4 文档型数据库

--7.4.1文档型数据库-1

--7.4.2文档型数据库-2

--7.4.3文档型数据库-3

-7.5 图形数据库

--7.5.1图形数据库-1

--7.5.2图形数据库-2

--7.5.3 图形数据库-3

-7.6 HBase数据库项目实践

--7.6 HBase数据库项目实践

-第7章 NoSQL数据库技术--本章单元测试

-第7章 NoSQL数据库技术--本章重点问题讨论

期末考试

-期末测试--期末测试

5.3.2 并发控制-2笔记与讨论

也许你还感兴趣的课程:

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