MySQL并发事务解决机制
- 锁机制:用于控制并发事务,防止数据不一致。
- MVCC(多版本并发控制):优化并发性能,保证事务隔离。
锁的类型
-
表级锁:
- 适用场景:DDL操作,如ALTER TABLE。
- 隔离级别:所有隔离级别。
-
行级锁:
- 共享锁(Shared Lock):
- 解决读-读、读-写问题。
- 适用于读取操作,防止写操作。
- 隔离级别:读已提交及以上。
- 排他锁(Exclusive Lock):
- 解决写-写问题。
- 确保同一时间只有一个事务写操作。
- 隔离级别:所有隔离级别。
- 间隙锁(Gap Lock):
- 防止范围查询中插入新数据。
- 隔离级别:主要在可重复读。
- Next-Key Lock:
- 结合间隙锁和行锁。
- 防止插入新数据或修改已有数据。
- 防止幻读。
- 隔离级别:可重复读。
- 共享锁(Shared Lock):
MVCC原理
- 概念:InnoDB存储引擎使用MVCC优化并发性能,确保事务隔离。
- 核心组件:
- 隐藏字段:DB_TRX_ID, DB_ROLL_PTR, DB_ROW_ID。
- Undo Log:记录原始值,形成版本链。
- Read View:确定事务可见的数据版本。
MVCC工作原理
- 快照读:在可重复读隔离级别下,SELECT不锁数据,根据Read View读取数据。
- 记录可见性规则:
- DB_TRX_ID小于min trx id:已提交,可见。
- DB_TRX_ID大于或等于min trx id且不在活跃事务列表:已提交,可见。
- DB_TRX_ID在活跃事务列表:查询undo log,提供已提交版本。
- DB_TRX_ID等于当前事务ID:当前事务修改,可见。
事务结束时的清理
- 事务提交后,旧版本数据可被purge线程清除,回收存储空间。
MVCC机制生效条件
- 读已提交(READ COMMITTED):每次SELECT获取最新已提交数据。
- 可重复读(REPEATABLE READ):默认隔离级别,事务内SELECT读取事务开始时的数据版本。
应用场景
- 在高并发OLTP系统中,MVCC是保证数据库高性能并发处理的重要手段。