当前课程知识点:数据库系统原理与开发 > 第5章 数据库管理 > 5.3 并发控制 > 5.3.1 并发控制-1
大家好!
我是主讲教师陆鑫
下面我们开始学习数据库课程
第5.3小节 并发控制—事务调度
本节学习目标如下
1)了解数据库并发事务控制目的
2)了解并发事务调度控制需要解决的问题
3)理解并发事务调度原理与策略
下面开始学习并发事务调度
一、为什么需要并发控制
当多个事务程序在DBMS系统中同时运行时
可能会出现对一些共享数据同时进行操作访问
如一些事务修改数据
另一些事务读取数据
这些并发的共享数据操作
如果在DBMS中没有一定的约束控制情况下
可能会带来数据不一致性或事务程序死锁问题
因此,在多个事务并发运行时
必须进行并发控制处理
并发控制目的
1)支持并发事务处理
使更多用户并行操作
提高系统的并发访问能力
2)保证一个事务工作不会对另一个
事务工作产生不合理的影响
二、并发控制需解决的问题
1.丢失更新数据
下面机票订购系统为例说明事务操作处理过程
如下图所示
有两个售票点并发进行机票订购操作处理
售票点1执行事务T1程序
售票点2执行事务T2程序
某航班机票余票数A为数据库共享数据
其初始值为16
首先事务T1读取A
其值为16
然后事务T2接着也读取A
其值也为16
售票点1先销售1张机票
共享数据A被事务T1修改为15
并写入数据库
售票点2接着也销售1张机票
共享数据A被事务T2修改为15
并写入数据库
最后, 在数据库中
该航班机票余票数A的值为15
执行结果: 剩余机票数A值为15
该数据有错, 应为14
错误分析:
T1、T2两个事务并发执行
它们均对数据库共享数据A进行了非锁定资源的读写操作
当事务T1和T2均读入该共享数据A并修改
T2提交的结果破坏了T1提交的结果
导致T1的修改被丢失
2.不可重复读取
不可重复读取是指一个事务对一个共享数据重复多次读取
但前后读取的数据不一致
例如, 下面事务T1和事务T2共享访问数据A
它们的语句执行顺序如下图所示
假如A的初始数据为100
事务T1首次读取A的值为100
事务T1不知道其它事务修改A值
事务T1第2次读取A的值为200
因此, 事务T1前后读取数据A的值不一致
问题分析: 为什么出现不可重复读取?
事务T1读取某一数据后
事务T2对其进行了修改
当事务T1再次读该数据时
得到与前一次不同的值
同类问题:
事务T1按一定条件从数据库中读取了某些数据记录后
事务T2删除了其中部分记录
当T1再次按相同条件读取数据时
发现某些记录消失了
也称为不可重复读取
事务T1按一定条件从数据库中读取某些数据记录后
事务T2在其中插入了一些记录
当T1再次按相同条件读取数据时
发现多了一些记录
称为幻象读取
3.脏数据读取
脏数据读取是指一个事务读取了被取消持久化的共享数据
例如, 下面事务T1和事务T2共享访问数据C
它们的语句执行顺序如下图所示
假如C的初始数据为100
事务T1首次读取C的值为100
事务T1将其进行计算
C的值被修改为200
事务T2之后读取C的值为200
此后事务T1取消对C的数据修改操作
其值恢复为100
问题分析: 事务T2并不知道C值被事务T1恢复
因此, 事务T2读取了脏数据
三、并发事务调度原理与策略
事务并发执行可能带来如下问题
当多个事务并发存取共享数据时
由于不当的数据操作顺序
可能出现数据不一致性问题
如丢失更新数据、不可重复读、脏数据读等问题
并发事务调度就是控制多个事务的
数据操作语句按照恰当的顺序访问共享数据
使这些事务执行之后
避免导致数据的不一致性
即解决“丢失更新数据”、“不可重复读”
“脏数据读”等问题
1.事务调度原理
在DBMS服务器中
执行事务SQL程序
需要通过系统的事务管理器对事务SQL程序执行进行管理
如下图界面所示
在DBMS中
事务管理器将并发执行事务的SQL数据操作
请求提交给并发控制调度器
由并发控制调度器将各个事务的SQL数据操作
请求按照一定顺序进行调度执行
并完成对数据库缓冲区的读写操作
2.事务调度策略
下面以实例来说明事务不同调度策略的运行结果情况
例如, 银行客户A的账户当前余款为1000元
客户B的账户当前余款为1500元
现在有两个事务T1、T2
其中T1事务将从客户A转账2000元到客户B
T2事务也将从客户A转账400元到客户B
T1事务和T2事务的数据操作语句如下图所示
下面先给出事务T1和事务T2的两种操作语句调度顺序方式
调度1和调度2
它们的执行顺序如下图所示
调度1:事务T1操作语句先执行
然后再执行事务T2操作语句
调度2:事务T2操作语句先执行
然后再执行事务T1操作语句
调度1执行后
账户A余额=400元
账户B余额=2100元
调度2执行后
账户A余额=400元
账户B余额=2100元
下面再给出事务T1和事务T2的另外两种操作语句调度顺序方式
调度3和调度4
它们的执行顺序如下图所示
调度3:事务T1、T2交替执行
其顺序见图所示
调度4:事务T1、T2操作语句也交替执行
但其顺序与调度3有所不同
调度3执行后
账户A余额=400元
账户B余额=2100元
调度4执行后
账户A余额=800元
账户B余额=1900元
从前面给出的事务T1和事务T2的4种调度顺序执行结果来看
前面3种调度方式的结果数据正确
而调度4的执行结果数据错误
结论:在事务并发执行中
只有当事务中数据操作调度顺序的
执行结果与事务串行执行结果一样时
该并发事务调度才能有效保证数据操作的正确性和一致性
符合这样效果的调度称为可串行化调度
DBMS并发事务调度目标
使并发事务调度实现的处理结果
与串行化调度处理结果一致
好了,本节学习结束!
-1.1 数据库及其系统概念
-1.2 数据库技术发展
-1.3 数据库应用系统
-1.4 典型数据库管理系统
-1.5 PostgreSQL对象-关系数据库系统软件
-第1章 数据库系统概论--本章单元测试
-2.1 关系及其相关概念
-2.2 关系模型原理
-2.3 PostgreSQL数据库关系操作实践
-第2章 数据库关系模型--本章单元测试
-3.1 SQL语言概述
-3.2 数据定义SQL语句
-3.3 数据操纵SQL语句
-3.4 数据查询SQL语句
-3.5 数据控制SQL语句
-3.6 视图SQL语句
-3.7 PostgreSQL数据库SQL实践
-第3章 数据库操作SQL语言--本章单元测试
-4.1 数据库设计概述
-4.2 E-R模型方法
-4.3 数据库建模设计
-4.4 数据库规范化设计
-4.5 数据库设计模型SQL实现
-4.6 基于Power Designer的数据库设计建模实践
--4.6 基于Power Designer的数据库设计建模实践
-第4章 数据库设计与实现--本章单元测试
-5.1 数据库管理概述
-5.2 事务管理
--5.2 事务管理
-5.3 并发控制
-5.4 安全管理
-5.5 数据库备份与恢复
-5.6 PostgreSQL数据库管理项目实践
-第5章 数据库管理--本章单元测试
-6.1 数据库连接技术
-6.2 数据库存储过程
-6.3 数据库触发器
-6.4 数据库游标
-6.5 嵌入式SQL编程
-第6章 数据库应用编程--本章单元测试
-7.1 NoSQL数据库概述
-7.2 列存储数据库
-7.3 键值对数据库
-7.4 文档型数据库
-7.5 图形数据库
-7.6 HBase数据库项目实践
-第7章 NoSQL数据库技术--本章单元测试
-期末测试--期末测试