MySQL 锁简介及死锁问题分析
Posted IT技术闲聊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 锁简介及死锁问题分析相关的知识,希望对你有一定的参考价值。
1
mysql的锁
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
如果一个事务请求的锁模式与当前的锁兼容, InnoDB 就将请求的锁授予该事务; 反之, 如果两者不兼容,该事务就要等待锁释放。
2
InnoDB加锁过程
组合一: Read Committed 隔离级别,k列是主键,给定SQL:update t1 set update_time = now() where k = 10; 只需要将主键上 k = 10的记录加上X锁即可。
组合二: Read Committed 隔离级别,k列有unique索引,unique索引上的k=10一条记录加上X锁,同时,会根据读取到的列,回主键索引(聚簇索引),然后将聚簇索引上对应的主键索引项加X锁。
组合三: Read Committed 隔离级别,k列上有索引,那么对应的所有满足SQL查询条件的记录,都会被加锁。同时,这些记录在主键索引上的记录,然后将聚簇索引上对应的主键索引项加X锁。
组合四: Read Committed 隔离级别,若k列上没有索引,SQL会走聚簇索引的全扫描进行过滤,由于过滤是由MySQL Server层面进行的。因此每条记录,无论是否满足条件,都会被加上X锁。但是,为了效率考量,MySQL做了优化,对于不满足条件的记录,会在判断后放锁,最终持有的,是满足条件的记录上的锁,但是不满足条件的记录上的加锁/放锁动作不会省略。同时,优化也违背了2PL的约束。
组合五: Repeatable Read 隔离级别,k列是主键列,给定SQL update t1 set update_time = now() where k = 10; 只需要将主键上 k = 10的记录加上X锁即可。
组合六: Repeatable Read 隔离级别,k列有unique索引,unique索引上的k=10一条记录加上X锁,同时,会根据读取到的列,回主键索引(聚簇索引),然后将聚簇索引上对应的主键索引项加X锁。
组合七:Repeatable Read 隔离级别,k列有索引, 通过索引定位到第一条满足查询条件的记录,加记录上的X锁,加GAP上的GAP锁,然后加主键聚簇索引上的记录X锁,然后返回;然后读取下一条,重复进行。直至进行到第一条不满足条件的记录,此时,不需要加记录X锁,但是仍旧需要加GAP锁,最后返回结束。
组合八: 在Repeatable Read隔离级别下,如果进行全表扫描的当前读,那么会锁上表中的所有记录,同时会锁上聚簇索引内的所有GAP,杜绝所有的并发 更新/删除/插入 操作
聚簇索引上的所有记录,都被加上了X锁。其次,聚簇索引每条记录间的间隙(GAP),也同时被加上了GAP锁。
组合九:Serializable隔离级别下直接用加锁的方式来避免并行访问。
3
什么情况下会造成死锁
解决死锁的方法:让不同的session加锁有次序。
4
场景复现
|
表结构为,一个主键id,另一个唯一索引number。表里的数据如下:
|
出现死锁的操作如下:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5
问题排查
|
事务2删除number=2的记录,为record lock行锁,非间隙锁。占用X锁。
|
事务2插入number=2的记录,S锁等待(insert语句在普通情况下是会申请排他锁,也就是X锁,但是这里出现了S锁。这是因为number字段是唯一索引,所以insert语句会在插入前进行一次duplicate key的检查,为了使这次检查成功,需要申请S锁防止其他事务对a字段进行修改。)
|
因为事务2第2步占用了X锁,故事务1进行等待。Record lock行锁,非间隙锁。
|
|
|
|
|
|
|
执行成功,事务2占有number=2下的X锁,类型为记录锁。 |
|
|
|
|
|
|
|
|
|
由于number字段建立了唯一索引,所以需要申请S锁以便检查duplicate key,由于插入的number的值还是2,所以排在X锁后面。但是前面的X锁的申请只有在事务2 commit或者rollback之后才能成功,此时形成了循环等待,死锁产生。 |
6
其它一些情况
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
将在下一期具体分析各种死锁的发生情况。
END
关注更多精彩
喜欢这篇文章就给我个在看吧
以上是关于MySQL 锁简介及死锁问题分析的主要内容,如果未能解决你的问题,请参考以下文章