Mysql死锁场景三(普通insert并发插入)

数据准备(与其他场景一样):

create table t(c1 int primary key, c2 int, c3 int, c4 int, unique index i_c2(c2), index i_c3(c3));

insert into t values (10, 11, 12, 13), (20, 21, 22, 23), (30, 31, 32, 33), (40, 41, 42, 43);

表名t,c1列为主键,c2列为唯一索引,c3列为普通索引
数据库隔离级别:RC(注意,隔离级别变成RC了)
数据库版本:mysql 5.7.21

锁阻塞示意图(后续分析的时候,用得到):


image.png

1.死锁场景描述

1.1场景说明

重复提交数据,比如前端提交按钮重复点击了多次,后端也没有控制

1.2场景描述(与场景二一样,只是sql没有了on duplicate key)

在唯一索引c2的间隙(31,41)插入3条相同记录。会话1插入1条c2=36的记录,会话2插入相同数据,会话3插入相同数据,会话1回滚,会话2,3形成了死锁。(如果会话1提交,不会形成死锁)

会话1:
start transaction;
insert into t values(50,36,52,53);

会话2:
start transaction;
insert into t values(51,36,62,63);

会话3:
start transaction;
insert into t values(52,36,62,63);

这个时候会话2,会话3都阻塞了,我们可以查看一下锁信息
另外开启一个会话4

show engine innodb status;


image.png

暂不分析,后面一起分析

会话1:
rollback;
这个时候可以看到会话2,3形成了死锁

会话4查看死锁信息:
show engine innodb status;


image.png

1.3死锁分析

1.3.1 图1分析

会话2,3被会话1阻塞的时候,会话2,3都显示lock mode S waiting。这个意思是等待共享的next-key锁。因为会话1持有了新插入记录的锁,会话2,3等待在这条记录上加共享的next-key锁。

1.3.2 图2分析

死锁信息表明,会话2,3都在等待插入意向锁,会话3显示持有了lock mode S locks gap before rec(共享的间隙锁)。会话2,3都持有了4把锁,会话2也应该持有了相同的间隙锁。死锁跟场景二一样了,插入意向锁被gap锁阻塞了(相互阻塞)。与场景二唯一的区别是,等待的是共享的next-key锁(场景二排他的),会话1回滚后,拿到的是共享的gap锁(场景二排他的)。

1.3.3 隔离级别改为REPEATABLE-READ

大家可以尝试一下,结果是一模一样的

1.3.4 会话1修改为删除一条记录

这个场景可以修改一下,会话1删除1条已经存在的记录,会话2,3分别插入相同的记录。比如:
会话1: delete from t where c2=31;
会话2:insert into t values(32,31,322,332);
会话3:insert into t values(33,31,323,333);
会话1:提交
也会有概率地出现死锁。原因差不太多,删除的时候,会锁住c2=31的记录,阻塞会话2,3获取next-key锁。一旦会话1提交,会话2,3都会拿到next-key锁,发现记录删除了,重新扫描,变成获取gap锁了(这里有一定的概率,因为有可能一个会话执行比较快,直接拿完gap锁和插入意向锁了,另外一个会话还在拿gap锁的路上)。都去获取插入意向锁的时候,互相等待对方释放gap锁
隔离级别为RC或者RR都会有概率出现死锁

1.3.5 会话2,3sql加上on duplicate key

会话2:insert into t values(32,31,322,332) on duplicate key update c3=322;
会话3:insert into t values(33,31,323,333) on duplicate key update c3=323;
这样不会有死锁,查看锁等待信息,可以看到也是等待获取next-key锁,会话1提交后,也会发生锁迁移,但是还是去获取next-key锁,这样会话2,3就只有一个能够进入。这里比较奇怪,为什么没有变成去获取gap锁,没想通

2.如何规避

跟场景二一样

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容