MySQL 事务隔离级别与锁机制深度解析
事务隔离级别决定了并发事务之间的可见性,InnoDB 默认 REPEATABLE READ。
1. 四大隔离级别
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | 是 | 是 | 是 |
| READ COMMITTED | 否 | 是 | 是 |
| REPEATABLE READ | 否 | 否 | 否(通过 MVCC + 间隙锁) |
| SERIALIZABLE | 否 | 否 | 否 |
查看当前隔离级别:
SELECT @@transaction_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;2. InnoDB 锁类型
- 共享锁 (S):
SELECT ... LOCK IN SHARE MODE - 排他锁 (X):
SELECT ... FOR UPDATE - 意向锁 (IS/IX):表级别,用于协调行锁和表锁。
- 间隙锁 (Gap Lock):锁定索引记录之间的间隙,防止幻读。
3. 死锁排查
-- 查看当前事务
SELECT * FROM information_schema.INNODB_TRX;
-- 查看锁等待
SELECT * FROM performance_schema.data_locks;
-- 最近死锁日志
SHOW ENGINE INNODB STATUS\G4. 优化建议
- 保持事务短小,及时提交。
- 按相同顺序访问资源,减少死锁概率。
- 使用索引更新,避免锁表。
