换个角度看待MySQL死锁的一点简单认识

作者: admin 分类: 公众号存档            2 次浏览 发布时间: 2017-09-27 23:59

公众号:杨建荣的学习笔记 · 作者:r13笔记第95天 · 发布:2017-09-27 23:59:39 · 原文链接

在MySQL锁机制的部分,一般都会提到一个所模式的兼容矩阵,看起来比较枯燥,而且不大容易理解。

那我们可以换个角度,取出其中的一个冲突场景,比如下面的场景在两个会话中,就很可能出现。

会话1,会话2都添加了S锁,然后后续的操作都相继添加X锁,明细的信息就不多说了,这种情况下很可能就会触发死锁。而这个层面其实在RR,RC中都会出现。

我们举一反三,来逐步扩展一下。我们创建一个表dt1

mysql> create table dt1 (id int unique
Query OK, 0 rows affected (0.03 sec) 

会话1:

begin;

select *from dt1 lock in share mode;

会话2:

begin;

select *from dt1 lock in share mode;

会话1:

insert into dt1 values(1);

会话2:

insert into dt1 values(1);

这种情况下就会触发死锁。

这个例子这样看来很简单,如果我们把这个问题复杂化一下,这个S锁可以通过其他的方式引入进来。

比如下面的场景:

会话1:
begin;
insert into dt1 values(1);
会话2:
insert into dt1 values(1);
会话3:
insert into dt1 values(1);
会话1:
rollback;
感兴趣可以测试一下,按照这个思路,可以扩展出很多的死锁场景,简直就手到擒来。

admin

杨建荣,《Oracle DBA工作笔记》《MySQL DBA工作笔记》作者,dbaplus社群发起人之一,腾讯云TVP,现任竞技世界系统部经理,拥有十多年数据库开发和运维经验,目前专注于开源技术、运维自动化和性能调优

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注