介绍
排它锁(Exclusive
),又称为X 锁,写锁。
共享锁(Shared
),又称为S 锁,读锁。
X和S锁之间有以下的关系: SS可以兼容的,XS、SX、XX之间是互斥的
显式加锁:select … lock in share mode 强制获取共享锁,select … for update 获取排它锁
实例
首先保证开启手动提交,并且事务处于可重复读隔离级别(REPEATABLE-READ)
一个会话显式获取写锁,另一个会话执行查询获取写锁会阻塞:
但是另一个会话如果在不同行获取读锁 和写锁 则可行:
注意上面两张图都是在 会话2
InnoDB
的行锁是加在索引项上的,是给索引在加锁的,并不是给单纯的行加锁,如果过滤条件没有索引的话,使用的就是表锁,而不是行锁:
此时如果我们为 name
加上辅助索引,就可以不同行获取行锁(最终是到主键索引树上加锁)。
如果会话2想获取 name=‘zhangsan’ 的行锁还是会阻塞
辅助索引树上节点存有主键索引值,当查询字段时,可用主键索引回主键索引查询
SERIALIZABLE的加锁机制
表数据如下:
如果对同一行执行读写操作会加锁:
会话1:
会话2:
但是不同行还是可以获取锁(会话2):