数据库14-事务与并发调度
事务并发
某些突发故障可能导致数据库产生不一致的结果;并发执行应用可以提高性能,但是有可能带来数据操作结果不符合预期
数据库的更新:
- 读数据库:将数据库中数据先从磁盘读入内存,然后再将值赋予另一个变量;
- 写数据库:现将变量的值写入内存,然后再有内存写入磁盘;
- 数据库更新应该权衡减少在磁盘上的I/O&防止数据不一致
概念
事务是用户定义的一个数据库操作序列
- 这些工作是原子的,要么全做,要么全不做,是不可分割的工作单位;
- 一个事务可以是一条SQL语句,一组SQL语句或整个程序
- 一个应用程序可以包含事务
定义
在SQL中可以显式定义
1 | BEGIN TRANSACTION |
没有显式定义事务时,DBMS按缺省方式自动划分事务
特性ACID
- 原子性Atomicity:
- 事务的所有操作在数据库中要么全部正确反映,要么全部不反应;
- 系统崩溃后,DBMS将恢复或撤销系统崩溃前处于活动状态的事务对数据库产生的影响,从而保证事务的原子性
- 事务管理部件处理
- 一致性Consistency:
- 事务完成时,必须所有数据具有一致的状态;
- 一般由开发者确保
- 隔离性Isolation:
- 当多个事务并发执行时,一个事务的执行不能被其他事务干扰
- 解决前面提到的并发执行带来的错误问题
- 交错调度的效果应该和某个串行调度结果是一致的
- 并发控制部件处理
- 持续性Durability:
- 一个事务一旦提交,它对数据库中的数据的改变应该是永久性的,即使系统可能出现故障
- 恢复管理部件负责
事务并发
概念
并发执行的优点:改善系统的资源利用率,减少短事务的等待时间
调度:一个或者多个事务的操作按时间排序的一个序列
不受控制的事务调度问题:
- 丢失更新
- 读脏数据
- 不可重复读
- 幻读
原因:事务ACID特性中隔离性被破坏
隔离级别
如何实现事务隔离?
- 串行:每个事务一次顺序执行
- 并行但控制:事务之间并发执行,收到DBMS调整事务调度
隔离级别 | 丢失更新 | 读脏数据 | 不可重复读 | 幻读 |
---|---|---|---|---|
读未提交 | 解决 | |||
读提交 | 解决 | 解决 | ||
重复读 | 解决 | 解决 | 解决 | |
序列化 | 解决 | 解决 | 解决 | 解决 |
读未提交Read Uncommitted
一个事务可以读取另一个未提交事务的数据
读提交Read Committed
一个事务要等另一个事务提交后才能读取数据
重复读Repeatable Read
在开始读数据时,不允许修改操作
序列化Serializable
最高的事务隔离级别,事务在这个级别下串行化执行,在该级别下性能最低
可串行化调度
概念
事务交叉调度结果与某一个串行调度结果相同
调度可串行化意味着保持着数据库的一致性,DBMS需要事务调度管理
- 事务并发完全交给操作系统并不可靠
- 调度不一定能保持数据库一致
- DBMS对事务运行加以控制,确保一致性
数学化表示
操作 | 简写 |
---|---|
读READ | R |
写WRITE | W |
事务T写数据库元素x | WT(x) |
事务T读数据库元素x | RT(x) |
调度(事务序列) | S = …. |
指令冲突
指令冲突性:调度中两个事务发生冲突,意味着
- 必须对同一数据对象进行操作
- 两个指令有一个写操作
冲突等价:对于调度S中属于不同事务的两条操作指令是不冲突的,则可以交换两条指令的执行顺序,得到一个新的调度S‘,称两个调度冲突等价
冲突可串行化:若一个冲突等价于一个串行调度,则这个调度是冲突可串行化的;
- 冲突可串行是可串行性的充分条件
视图等价:对于同一事务集,若两个调度$S_1$和$S_2$视图等价
- 在任何事务保证美俄事务读取相同的值,
- 写入数据库最终状态也是一样的;
视图可串行化:若某个调度视图等价于一个串行调度,则称这个调度是视图可串行化的;
- 若调度是冲突可串行化的,则一定是视图可串行化的
- 反之未必
前驱图precedence graph
定义有向前驱图$G(V,E)$
顶点为调度S的事务
$T_i\to T_j$表示$T_i$先于$T_j$对应的指令执行,且二者存在某一对冲突指令
若前驱图存在环,则调度S不是可串行化的;
若前驱图不存在环,表示调度是冲突可串行化的
一个拓扑排序意味调度一个等价的串行调度