深入浅出 MySQL 深入理解数据库事务与锁机制:ACID特性全解析

ACID

在关系型数据库中,一个逻辑工作单元要成为事务,必须满足4个特性:原子性、一致性、隔离性、持久性。

1. 原子性(Atomicity)

事务中的操作要么全部执行成功,要么全部不执行。如果事务中的任何一部分操作失败,整个事务将回滚到最初状态。

2. 一致性(Consistency)

确保事务在完成时,必须使数据库从一个一致状态转变为另一个一致状态。

3. 隔离性(Isolation)

多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

隔离级别

  • 读未提交(Read Uncommitted)
  • 读已提交(Read Committed)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)

4. 持久性(Durability)

一旦事务提交,其所做的修改将永久保存在数据库中。

原子性

事务是数据库操作的基本单元:

  1. 事务开始后,首先在Buffer Pool中进行数据修改
  2. 同时会生成对应的Redo日志和Undo日志
  3. 这些日志会立即写入磁盘的日志文件
  4. 最后才会将Buffer Pool中的脏页刷写到磁盘

持久性

一个完整的提交动作会触发以下关键操作序列:

  1. binlog落地
  2. 发送binlog
  3. 存储引擎提交
  4. flush_logs
  5. check_point
  6. 事务提交标记

隔离性

读未提交

  • 允许事务读取其他事务未提交的数据
  • 可能导致脏读

读提交

  • 只允许读取已提交的数据
  • 解决了脏读问题

可重复读

  • MySQL InnoDB引擎的默认隔离级别
  • 确保同一事务内多次读取同样数据结果一致
  • 通过MVCC实现

串行化

  • 最高的隔离级别
  • 完全串行执行事务
  • 解决所有并发问题

一致性

约束一致性

  • 外键约束
  • 唯一索引
  • Check约束

数据一致性

  • 由原子性、持久性、隔离性共同保证

WAL:Write-Ahead Logging,先写日志,再写磁盘。