数据库事务处理技术-并发控制
📌 本讲学习目标
- 基本内容
- 理解并发控制的必要性
- 掌握事务调度及可串行性概念
- 掌握基于封锁的并发控制方法
- 理解基于时间戳的并发控制方法
- 了解基于有效性确认的并发控制方法
- 重点难点
- 三种并发不一致性问题及产生原因
- 事务ACID特性与并发控制关系
- 冲突可串行性判别算法
- 两段封锁协议原理与应用
- 基于时间戳的并发控制规则
🔍 为什么需要并发控制
并发操作导致的问题
丢失修改
- 后一次修改覆盖前一次修改结果
- 示例:两个事务同时减少账户余额
不可重复读
- 同一事务两次读取同一数据结果不一致
- 示例:事务A读取数据后被事务B修改
脏读
- 读取到未提交的无效数据
- 示例:事务A读取事务B未提交的修改,随后B回滚
并发控制必要性
- 保证多用户并发访问时数据一致性
- 避免上述三种典型不一致性问题
- 确保数据库始终处于有效状态
📦 事务的概念与特性
事务定义
- 宏观:应用程序员视角
一组SQL语句的逻辑执行单元(BEGIN TRANSACTION → COMMIT/ROLLBACK) - 微观:DBMS视角
一系列基本操作(读、写)的整体执行序列
ACID特性
特性 | 描述 | 保证机制 |
---|---|---|
原子性 | 事务操作要么全做,要么全不做 | 日志与恢复 |
一致性 | 事务操作保持数据一致性 | 并发控制 |
隔离性 | 并发事务互不干扰 | 并发控制 |
持久性 | 已提交事务结果永久保存 | 日志与恢复 |
graph LR A[应用程序] --> B[事务管理器] B --> C[调度器] C --> D[锁表/时间戳] D --> E[数据存储]
🔄 事务调度与可串行性
基本概念
- 调度:事务基本操作(读、写)的执行顺序
- 串行调度:事务顺序执行,无交叉
- 并发调度:操作交叉执行
可串行性
- 定义:若调度效果等价于某个串行调度,则称其可串行化
- 冲突可串行性:通过交换相邻无冲突操作可转换为串行调度
- 冲突操作:不同事务对同一数据的读写/写写操作
- 非冲突:不同事务对不同数据的操作
冲突可串行性判别算法
- 构造前驱图
- 结点:事务
- 边:Tᵢ → Tⱼ(若Tᵢ操作在Tⱼ前且冲突)
- 检测环存在
- 无环 → 冲突可串行化
- 有环 → 非冲突可串行化
示例:
调度:r₂(A); r₁(B); w₂(A); r₃(A); w₁(B); w₃(A); r₂(B); w₂(B)
前驱图:T₁ → T₂(因w₁(B)在r₂(B)前)→ 无环,可串行化
🔒 基于封锁的并发控制
锁的类型
锁类型 | 描述 | 相容性 |
---|---|---|
共享锁(S) | 允许多读,禁止写 | S相容,X不相容 |
排他锁(X) | 禁止其他读写 | 均不相容 |
更新锁(U) | 初始读,可升级写 | 特殊规则 |
封锁协议
协议级别 | 加锁规则 | 解决不一致性 |
---|---|---|
0级 | 写前加X锁,操作完即释放 | 丢失修改 |
1级 | 写前加X锁,事务结束释放 | 丢失修改+脏读 |
2级 | 读前加S锁(用完释放),写前加X锁(事务结束释放) | 丢失修改+脏读+不可重复读 |
3级 | 读写前加锁,事务结束释放 | 所有不一致性 |
SQL隔离级别
隔离级别 | 脏读 | 不可重复读 | 幻读 | 对应协议 |
---|---|---|---|---|
读未提交 | ✓ | ✓ | ✓ | 0级 |
读已提交 | ✗ | ✓ | ✓ | 1级 |
可重复读 | ✗ | ✗ | ✓ | 2级 |
可串行化 | ✗ | ✗ | ✗ | 3级 |
⏱️ 基于时间戳的并发控制
核心概念
- 时间戳:事务启动时分配的唯一递增标识
- 数据元素标记:
- RT(x):最后读x的事务时间戳
- WT(x):最后写x的事务时间戳
- C(x):最近写x的事务提交状态
调度规则
操作 | 条件 | 处理方式 |
---|---|---|
读操作 | TS(T) ≥ WT(x) | 允许读,更新RT(x) |
TS(T) < WT(x) | 回滚事务 | |
写操作 | TS(T) ≥ RT(x) | 允许写,更新WT(x) |
TS(T) < RT(x) | 回滚事务 | |
TS(T) < WT(x)且C(x)=true | 忽略写(托马斯规则) |
优势:无需加锁,避免死锁
代价:可能导致事务回滚重启
✅ 基于有效性确认的并发控制
三阶段执行
- 读阶段:读取数据到局部空间
- 有效性确认阶段:检查读写集冲突
- 写阶段:提交修改到数据库
有效性确认规则
- 对FIN(U) > START(T)的事务U:
- RS(T) ∩ WS(U) = ∅
- 对FIN(U) > VAL(T)的事务U:
- WS(T) ∩ WS(U) = ∅
冲突检测:
- 读集冲突:T读取了U未提交的修改
- 写集冲突:T和U同时修改同一数据
优势:批量检测冲突,减少回滚
局限:需要维护读写集,内存开销大
💎 总结回顾
并发控制方法对比
方法 | 核心机制 | 优势 | 局限 |
---|---|---|---|
封锁法 | 加锁/解锁 | 直观易实现 | 可能死锁 |
时间戳 | 时间戳排序 | 无死锁 | 回滚开销大 |
有效性确认 | 读写集检测 | 批量处理 | 内存消耗大 |
关键要点
flowchart TD A[并发问题] --> B[事务ACID] B --> C[调度可串行性] C --> D[冲突检测] D --> E[封锁/时间戳/有效性] E --> F[数据一致性]
DBMS核心技术:
通过并发控制机制保证多用户环境下数据一致性和事务隔离性,是数据库系统核心功能之一。