读锁与写锁
X锁
S锁
X锁
冲突
冲突
S锁
冲突
不冲突
读锁:当前事务给某些数据加了读锁,允许其他事务加读锁但不允许加写锁。也可以称之为共享锁、Shared Locks、S锁
示例
select * from table_a lock in share mode
使用场景:读出数据后其他事务不能修改,但自己也不一定能修改,因为其他事务也可以加读锁。主要用来保证数据在本事务内值不会变。但实际开发中用得比较少。
写锁:当前事务如果加了写锁,其他事务若加锁会阻塞。也可以称之为排他锁、Exclusice Locks、X锁
示例
select * from table_a for update 以及 DELETE/UPDATE/INSERT(插入后未提交的数据也会加写锁)
使用场景:只有本事务才可以修改这些数据,其他事务加锁会阻塞。一般开发过程中大部分接触到的锁都是写锁。
行锁与表锁
行锁:只有InnoDB里才会有。
行锁又分为:
LOCK_REC_NOT_GAP:单个行记录上的锁。
LOCK_GAP:间隙锁,锁定一个范围,但不包括记录本身。什么意思呢?比如查询一条ID为7的数据,间隙锁是给ID=7这条数据上下记录间的间隙给锁定,但记录本身不上锁。就如MVCC是解决可重复读的问题一样,间隙锁是解决幻读的问题,即同一事务内,数据总数不变。
LOCK_ORDINARY:同上,也是间隙锁