数据库14-事务与并发调度

事务并发

某些突发故障可能导致数据库产生不一致的结果;并发执行应用可以提高性能,但是有可能带来数据操作结果不符合预期
数据库的更新:

  • 读数据库:将数据库中数据先从磁盘读入内存,然后再将值赋予另一个变量;
  • 写数据库:现将变量的值写入内存,然后再有内存写入磁盘;
  • 数据库更新应该权衡减少在磁盘上的I/O&防止数据不一致

概念

事务是用户定义的一个数据库操作序列

  • 这些工作是原子的,要么全做,要么全不做,是不可分割的工作单位;
  • 一个事务可以是一条SQL语句,一组SQL语句或整个程序
  • 一个应用程序可以包含事务

定义

在SQL中可以显式定义

1
2
3
4
5
BEGIN TRANSACTION 
<SQL1>
<>
COMMIT|ROLLBACK
END 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不是可串行化的;

  • 若前驱图不存在环,表示调度是冲突可串行化的

  • 一个拓扑排序意味调度一个等价的串行调度