主要讨论RR隔离级别,由于RC只是少了间隙锁。html
1.共享锁(Shared Locks,S锁) 2.排他锁(Exclusive Locks,X锁)mysql
能够一块儿读,读写/写写互斥。sql
1.意向共享锁(intention shared lock,IS) 2.意向排它锁(intention exclusive lock,IX).net
看起来像表级锁,解决表级锁和行级锁的冲突。 意向锁之间兼容。 事务在请求S锁和X锁前,须要先得到对应的IS、IX锁。htm
S | X | |
---|---|---|
IS | 兼容 | 互斥 |
IX | 互斥 | 互斥 |
记录锁(Record Locks) 单条索引记录上加锁,record lock锁住的永远是索引,而非记录自己。若是没有显示索引,innodb会建立隐式的汇集索引。blog
间隙锁(Gap Locks) 锁住一个索引区间(开区间)。 锁住索引记录的区间,或第一条索引记录以前的范围,或者最后一条索引记录以后的范围。索引
临键锁(Next-Key Locks) 记录锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间(左开右闭区间)。事务
插入意向锁(Insert Intention Locks) 一种特殊的间隙锁。 两个事务只要插入的行没有冲突,即便在同一间隙,也能够插入。ci
锁兼容矩阵get
Gap | Insert Intention | Record | Next-Key | |
---|---|---|---|---|
Gap | 兼容 | 兼容 | 兼容 | 兼容 |
Insert Intention | 冲突 | 兼容 | 兼容 | 冲突 |
Record | 兼容 | 兼容 | 冲突 | 冲突 |
Next-Key | 兼容 | 兼容 | 冲突 | 冲突 |
存在Insert Intention 锁时,申请Gap锁是容许的;可是存在Gap锁时,申请Insert Intention锁时是被阻止的。
表级锁,多个事务同时插入时,保证AUTO_INCREMENT列递增。
1.读未提交,读提交,可重复读 不加锁,快照读 2.串行化,普通select会升级为select ... in share mode
select ... for update select ... in share mode 1.惟一索引,惟一条件 记录锁(Record Locks) 2.其余的查询条件和索引条件 间隙锁(Gap Locks)与临键锁(Next-Key Locks)
1.惟一索引,惟一条件 记录锁(Record Locks) 2.其余, 排他临键锁(Next-Key Locks)
排它锁、同时,会在插入区间加插入意向锁(insert intention lock)。
参考:
dev.mysql.com/doc/refman/…
dev.mysql.com/doc/refman/…
mp.weixin.qq.com/s/tmkRAmc1M…
blog.csdn.net/zhanghongzh…
narcissusoyf.iteye.com/blog/163730…