深入浅出 MySQL 深入理解数据库事务与锁机制:ACID特性全解析
ACID
在关系型数据库中,一个逻辑工作单元要成为事务,必须满足4个特性:原子性、一致性、隔离性、持久性。
1. 原子性(Atomicity)
事务中的操作要么全部执行成功,要么全部不执行。如果事务中的任何一部分操作失败,整个事务将回滚到最初状态。
2. 一致性(Consistency)
确保事务在完成时,必须使数据库从一个一致状态转变为另一个一致状态。
3. 隔离性(Isolation)
多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
隔离级别:
- 读未提交(Read Uncommitted)
- 读已提交(Read Committed)
- 可重复读(Repeatable Read)
- 串行化(Serializable)
4. 持久性(Durability)
一旦事务提交,其所做的修改将永久保存在数据库中。
原子性
事务是数据库操作的基本单元:
- 事务开始后,首先在Buffer Pool中进行数据修改
- 同时会生成对应的Redo日志和Undo日志
- 这些日志会立即写入磁盘的日志文件
- 最后才会将Buffer Pool中的脏页刷写到磁盘
持久性
一个完整的提交动作会触发以下关键操作序列:
- binlog落地
- 发送binlog
- 存储引擎提交
- flush_logs
- check_point
- 事务提交标记
隔离性
读未提交
- 允许事务读取其他事务未提交的数据
- 可能导致脏读
读提交
- 只允许读取已提交的数据
- 解决了脏读问题
可重复读
- MySQL InnoDB引擎的默认隔离级别
- 确保同一事务内多次读取同样数据结果一致
- 通过MVCC实现
串行化
- 最高的隔离级别
- 完全串行执行事务
- 解决所有并发问题
一致性
约束一致性
- 外键约束
- 唯一索引
- Check约束
数据一致性
- 由原子性、持久性、隔离性共同保证
WAL:Write-Ahead Logging,先写日志,再写磁盘。