文章插图
从日志我们可以看到事务1正在执行的SQL为:
insert into song_rank(songId,weight) values(18,100) on duplicate key update weight=weight+1该条语句正在等待索引songId_idx的插入意向排他锁:
lock_mode X locks gap before rec insert intention waiting(2)事务2日志分析
文章插图
从日志我们可以看到事务2正在执行的SQL为:
insert into song_rank(songId,weight) values(16,100) on duplicate key update weight=weight+1该语句持有一个索引songId_idx的间隙锁:
lock_mode X locks gap before rec该条语句正在等待索引songId_idx的插入意向排他锁:
lock_mode X locks gap before rec insert intention waiting(3)锁相关概念补充(附)
考虑到有些读者可能对上面insert intention锁等不太熟悉,所以这里这里补一小节锁相关概念 。官方文档
InnoDB 锁类型思维导图:
文章插图
我们主要介绍一下兼容性以及锁模式类型的锁
① 共享锁与排他锁:
InnoDB 实现了标准的行级锁,包括两种:共享锁(简称 s 锁)、排它锁(简称 x 锁) 。
- 共享锁(S锁):允许持锁事务读取一行 。
- 排他锁(X锁):允许持锁事务更新或者删除一行 。
- T2 请求 s 锁立即被允许,结果 T1 T2 都持有 r 行的 s 锁
- T2 请求 x 锁不能被立即允许
② 意向锁
- 意向共享锁( IS 锁):事务想要获得一张表中某几行的共享锁
- 意向排他锁( IX 锁): 事务想要获得一张表中某几行的排他锁
InnoDB存储引擎中锁的兼容性如下表:
文章插图
③ 记录锁(Record Locks)
- 记录锁是最简单的行锁,仅仅锁住一行 。如:SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE
- 记录锁永远都是加在索引上的,即使一个表没有索引,InnoDB也会隐式的创建一个索引,并使用这个索引实施记录锁 。
- 会阻塞其他事务对其插入、更新、删除
RECORD LOCKS space id 58 page no 3 n bits 72 index `PRIMARY` of table `test`.`t` trx id 10078 lock_mode X locks rec but not gapRecord lock, heap no 2 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 4; hex 8000000a; asc ;; 1: len 6; hex 00000000274f; asc 'O;; 2: len 7; hex b60000019d0110; asc ;;④ 间隙锁(Gap Locks)
- 间隙锁是一种加在两个索引之间的锁,或者加在第一个索引之前,或最后一个索引之后的间隙 。
- 使用间隙锁锁住的是一个区间,而不仅仅是这个区间中的每一条数据 。
- 间隙锁只阻止其他事务插入到间隙中,他们不阻止其他事务在同一个间隙上获得间隙锁,所以 gap x lock 和 gap s lock 有相同的作用 。
- Next-key锁是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁 。
- 插入意向锁是在插入一行记录操作之前设置的一种间隙锁,这个锁释放了一种插入方式的信号,亦即多个事务在相同的索引间隙插入时如果不是插入间隙中相同的位置就不需要互相等待 。
- 假设有索引值4、7,几个不同的事务准备插入5、6,每个锁都在获得插入行的独占锁之前用插入意向锁各自锁住了4、7之间的间隙,但是不阻塞对方因为插入行不冲突 。
RECORD LOCKS space id 31 page no 3 n bits 72 index `PRIMARY` of table `test`.`child`trx id 8731 lock_mode X locks gap before rec insert intention waitingRecord lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 0 0: len 4; hex 80000066; asc f;; 1: len 6; hex 000000002215; asc " ;; 2: len 7; hex 9000000172011c; asc r ;;...(4)SQL加锁分析
推荐阅读
- Java架构-MYSQL大数据量下的操作与优化
- 做淘宝如何选品!给新手几个建议! 淘宝选品技巧
- 女性冬季如何养生 7个误区需注意
- 如何提高淘宝直播间流量 看淘宝直播费流量吗
- 秋季吃火锅要注意正确方式 如何吃火锅才正确
- 天猫商家如何开通隔日达服务 天猫发货时效规定48小时
- 秋季养生如何养好肺气?多吃白色食物
- 秋季养生防“燥”为主 女人秋季如何养生
- 秋季如何养生 早起五个小常识需谨记
- 轻松鉴别普洱老茶,如何鉴别陈年柑普茶