MySQL事务隔离级别和MVCC
MySQL的事务隔离级别和MVCC机制是保证数据一致性的重要机制。
核心问题
事务的ACID特性
- 原子性(Atomicity):事务要么全部成功,要么全部失败
- 一致性(Consistency):事务前后数据保持一致
- 隔离性(Isolation):事务之间相互隔离
- 持久性(Durability):事务提交后数据持久化
事务隔离级别
READ UNCOMMITTED:读未提交
- 可能出现脏读、不可重复读、幻读
READ COMMITTED:读已提交
- 避免脏读,可能出现不可重复读、幻读
REPEATABLE READ:可重复读(MySQL默认)
- 避免脏读、不可重复读,可能出现幻读
SERIALIZABLE:串行化
- 避免所有问题,但性能最低
MVCC(多版本并发控制)
实现原理:
- 每行数据有隐藏的版本号字段
- 通过undo log保存历史版本
- ReadView决定可见的版本
关键组件:
- undo log:保存历史版本
- ReadView:决定可见性
- 版本链:通过指针连接历史版本
常见面试题
脏读、不可重复读、幻读的区别?
- 脏读:读取到未提交的数据
- 不可重复读:同一事务内读取结果不一致
- 幻读:读取到新插入的数据
MVCC如何解决幻读?
- 使用Next-Key Lock
- 锁定范围,防止插入
MySQL的锁机制?
- 表锁:锁定整个表
- 行锁:锁定特定行
- 间隙锁:锁定范围