InnoDB通过行级锁、表级锁和意向锁保障并发一致性,行级锁包含S锁(共享读)与X锁(排他写),支持高并发;意向锁(IS/IX)用于表明行锁意图,协调表级冲突;间隙锁与临键锁防止幻读,常用于范围查询,合理设计索引和事务可减少锁竞争。
MySQL中的锁机制是为了保证数据库在并发操作下的数据一致性和完整性而设计的。不同的存储引擎支持的锁机制不同,其中InnoDB是MySQL最常用的存储引擎,它提供了行级锁、表级锁和意向锁等多种锁机制来应对并发访问。
行级锁(Row-Level Lock)
InnoDB支持行级锁,这意味着在执行写操作时,只会锁定需要修改的特定行,而不是整个表。这大大提高了并发性能。
共享锁(S锁 / 读锁):多个事务可以同时持有同一行的共享锁,用于读取数据,但不允许修改。
排他锁(X锁 / 写锁):只有一个事务能持有某行的排他锁,其他事务不能加任何类型的锁,直到该事务释放锁。
例如执行:
SELECT * FROM users WHERE id = 1 FOR UPDATE; —— 会为该行加上排他锁
SELECT * FROM users WHERE id = 1 LOCK IN SHARE MODE; —— 加上共享锁
表级锁(Table-Level Lock)
虽然InnoDB主要使用行级锁,但在某些情况下也会使用表级锁,比如全表扫描或不走索引的查询可能会导致锁住更多行甚至整张表。
MyISAM引擎只支持表级锁,读操作加共享锁,写操作加排他锁,粒度大,并发性能较差。
意向锁(Intention Locks)
意向锁是InnoDB为了支持行级锁而引入的一种表级锁,表示事务打算在表中的某些行上加锁。
- 意向共享锁(IS):事务打算给某些行加共享锁
- 意向排他锁(IX):事务打算给某些行加排他锁
意向锁之间是兼容的,但它们与表级的S/X锁有冲突规则。例如,一个事务要对表加S锁,必须等待所有IX/IS锁释放。
间隙锁与临键锁(Gap Lock 和 Next-Key Lock)
为了防止幻读,InnoDB在可重复读(REPEATABLE READ)隔离级别下使用间隙锁或临键锁。
- 间隙锁:锁定一个范围,但不包括记录本身,防止其他事务插入新记录
- 临键锁:行锁 + 间隙锁的组合,锁定记录及其前面的间隙
这些锁在唯一索引等值查询时通常不会启用,但在范围查询中非常关键。
基本上就这些。理解MySQL的锁机制有助于优化并发性能,避免死锁和长时间等待。实际开发中注意合理设计索引、控制事务大小,能有效减少锁冲突。