数据库内核入门-04 - 事务管理
· 4 min read
简述
这是数据库内核入门系列的第四篇文章,主要介绍数据库事务管理的基本概念和实现原理。
事务的概念
事务是数据库管理系统执行过程中的一个逻辑单位,由一系列对数据库的读/写操作组成。
ACID特性
事务通常需要满足ACID特性:
原子性(Atomicity)
事务中的所有操作要么全部完成,要么全部不完成。如果事务中的任何操作失败,整个事务都将回滚到初始状态。
实现机制
- 撤销日志(Undo Log):记录事务执行前的数据状态,用于回滚
- 影子分页(Shadow Paging):在修改数据时创建副本,事务提交时切换指针
一致性(Consistency)
事务执行前后,数据库都必须处于一致状态,满足所有的完整性约束。
实现机制
- 完整性约束检查
- 触发器
- 外键关联
隔离性(Isolation)
多个事务并发执行时,每个事务都应该感觉不到其他事务的存在。
隔离级别
- 读未提交(Read Uncommitted):允许读取未提交的数据
- 读已提交(Read Committed):只允许读取已提交的数据
- 可重复读(Repeatable Read):在一个事务内多次读取同一数据结果一致
- 串行化(Serializable):最高隔离级别,事务串行执行
持久性(Durability)
一旦事务提交,其对数据库的修改应该永久保存,即使系统崩溃也不会丢失。
实现机制
- 重做日志(Redo Log):记录事务的所有修改操作
- 检查点(Checkpoint):定期将内存中的脏数据刷新到磁盘
并发控制
锁机制
锁是最常用的并发控制机制,通过限制对数据的访问来保证事务的隔离性。
锁的类型
- 共享锁(S锁):允许多个事务同时读取数据
- 排他锁(X锁):只允许一个事务修改数据,阻止其他事务读取或修改
- 意向锁(Intention Lock):表示事务打算在更细粒度的级别上加锁
锁的粒度
- 表级锁:锁定整个表
- 页级锁:锁定数据页
- 行级锁:锁定单行数据
- 字段级锁:锁定单个字段
多版本并发控制(MVCC)
MVCC通过维护数据的多个版本来提高并发性能,读操作不会阻塞写操作,写操作也不会阻塞读操作。
MVCC的工作原理
- 每个事务都有一个唯一的事务ID
- 每次修改数据时创建一个新版本,而不是直接覆盖
- 读操作根据事务开始时的快照读取对应版本的数据
- 定期清理不再需要的旧版本数据
事务恢复
日志机制
日志是数据库恢复的基础,记录了事务执行的所有操作。
日志类型
- 物理日志:记录数据页的实际变化
- 逻辑日志:记录SQL语句或操作
- 生理日志:结合物理和逻辑日志的特点
WAL(Write-Ahead Logging)
WAL是一种常用的日志策略,要求在数据页写入磁盘前,必须先将相应的日志写入磁盘。
WAL的优势
- 提高性能:将随机写转换为顺序写
- 保证持久性:即使系统崩溃,也可以通过日志恢复
- 支持事务回滚:通过撤销日志恢复到事务开始前的状态
恢复过程
系统崩溃后的恢复过程通常包括以下步骤:
- 分析阶段:扫描日志,确定崩溃时活跃的事务
- 重做阶段:重新应用已提交事务的所有修改
- 撤销阶段:回滚未提交事务的所有修改
下一篇预告
在下一篇文章中,我们将介绍数据库的查询处理和优化,包括查询解析、查询计划生成和执行等关键步骤。