MySQL的行锁 - 知乎 (zhihu.com)
行锁:共享锁S和排他锁X
MySQL InnoDB的行锁又分为共享锁(S锁)和排他锁(X锁)。
- 共享锁(读锁):其他事务可以读,但不能写。
- 排他锁(写锁) :其他事务不能读取,也不能写。
一般普通的select语句,InnoDB不加任何锁,我们称之为快照读
通过加S锁和X锁的select语句或者插入/更新/删除操作,我们称之为当前读
- select * from test lock in share mode; S锁
- select * from test for update; X锁
- insert into test values(...); X锁
- update test set ...; X锁
- delete from test ...; X锁
特殊说明:以上的当前读,读取的都是记录的最新版本。对读取记录都会加锁,除了第一条语句lock in share mode是对记录加S锁(共享锁)外,其他的操作都是加X锁(排他锁)。
为了允许行锁和表锁共存,实现多粒度锁机制,InnoDB 还有两种内部使用的意向锁(Intention Locks),这两种意向锁都是表锁:
- 意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的 IS 锁。
- 意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的 IX 锁。
锁模式的兼容情况: