MySQL 事务、锁与死锁排查
事务和锁是 MySQL 里最复杂也最容易出问题的部分。这篇文章从实际问题出发,梳理核心概念和排查思路。 事务隔离级别 MySQL 有四种隔离级别,对应不同的并发问题: 隔离级别 脏读 不可重复读 幻读 READ UNCOMMITTED ✓ 可能 ✓ 可能 ✓ 可能 READ COMMITTED ✗ 不会 ✓ 可能 ✓ 可能 REPEATABLE READ(默认) ✗ 不会 ✗ 不会 部分解决 SERIALIZABLE ✗ 不会 ✗ 不会 ✗ 不会 InnoDB 默认是 REPEATABLE READ,并且通过 MVCC + Gap Lock 解决了大部分幻读问题。 InnoDB 的锁类型 行锁(最常用): 共享锁(S 锁):SELECT ... LOCK IN SHARE MODE,允许多个事务同时读 排他锁(X 锁):SELECT ... FOR UPDATE 或增删改,同一时间只有一个事务能持有 意向锁:表级别的锁,表示"我将要对某些行加行锁",用于快速判断表级操作是否冲突。 Gap Lock(间隙锁):锁定索引记录之间的间隙,防止插入新记录,解决幻读。 Next-Key Lock:行锁 + Gap Lock 的组合,InnoDB 在 REPEATABLE READ 下默认使用。 ...