Skip to main content

数据库内核入门-04 - 事务管理

· 4 min read
ULis3h
Ex-ISCAS Software Engineer,

简述

这是数据库内核入门系列的第四篇文章,主要介绍数据库事务管理的基本概念和实现原理。

事务的概念

事务是数据库管理系统执行过程中的一个逻辑单位,由一系列对数据库的读/写操作组成。

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的工作原理

  1. 每个事务都有一个唯一的事务ID
  2. 每次修改数据时创建一个新版本,而不是直接覆盖
  3. 读操作根据事务开始时的快照读取对应版本的数据
  4. 定期清理不再需要的旧版本数据

事务恢复

日志机制

日志是数据库恢复的基础,记录了事务执行的所有操作。

日志类型

  • 物理日志:记录数据页的实际变化
  • 逻辑日志:记录SQL语句或操作
  • 生理日志:结合物理和逻辑日志的特点

WAL(Write-Ahead Logging)

WAL是一种常用的日志策略,要求在数据页写入磁盘前,必须先将相应的日志写入磁盘。

WAL的优势

  • 提高性能:将随机写转换为顺序写
  • 保证持久性:即使系统崩溃,也可以通过日志恢复
  • 支持事务回滚:通过撤销日志恢复到事务开始前的状态

恢复过程

系统崩溃后的恢复过程通常包括以下步骤:

  1. 分析阶段:扫描日志,确定崩溃时活跃的事务
  2. 重做阶段:重新应用已提交事务的所有修改
  3. 撤销阶段:回滚未提交事务的所有修改

下一篇预告

在下一篇文章中,我们将介绍数据库的查询处理和优化,包括查询解析、查询计划生成和执行等关键步骤。