文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL insert死锁问题解决详细记录

2022-11-13 19:21

关注

Insert死锁问题剖析

线上有个批量的insert … on duplicate key update语句引发的死锁问题,查过很多资料并且亲自尝试过后,发现好多博客说的都是错的,其实本身只跟insert的顺序有关,在此记录一下备忘。

前置知识

X型锁:排他锁

S型锁:共享锁

行锁:锁住一行记录

Next-Key锁:左开右闭区间

Gap锁:左右开区间

构造死锁

建表:

CREATE TABLE hero (
    number INT AUTO_INCREMENT,
    name VARCHAR(100),
    country varchar(100),
    PRIMARY KEY (number),
    UNIQUE KEY uk_name (name)
) Engine=InnoDB CHARSET=utf8;

构造初始数据:

INSERT INTO hero VALUES
    (1, 'l刘备', '蜀'),
    (3, 'z诸葛亮', '蜀'),
    (8, 'c曹操', '魏'),
    (15, 'x荀彧', '魏'),
    (20, 's孙权', '吴');

好了,开始了,下面开始两个事务,按顺序执行:

事务1

begin:
INSERT INTO hero(name, country) VALUES('g关羽', '蜀');

事务2

begin:
INSERT INTO hero(name, country) VALUES('g关羽', '蜀');

事务1

INSERT INTO hero(name, country) VALUES('d邓艾', '魏');

来了,它来了,这个时候我们就可以注意到事务2的死锁报错了:

# 事务T2
mysql> INSERT INTO hero(name, country) VALUES('g关羽', '蜀');
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

原因

请添加图片描述

故死锁产生的原因

MySQL 5.7 的死锁

前提

在比较新的版本中都可以遇见的,只要是insert … on duplicate key update 触发了后面的update操作,那么此时其他的insert语句都会被阻塞,这主要是为了解决RR下的一些幻读问题。

示例

在5.7版本中又有一些特殊情况。还是举例

假如有如下表和数据

demo表

idnamevalue
11112
12222
13332

此时,如果事务1执行了:

insert into demo (name, value) VALUES ("333", 1) ON duplicate KEY UPDATE value = value + 1;

事务2执行了:

insert into demo (name, value) VALUES ("223", 1) ON duplicate KEY UPDATE value = value + 1;

事务3执行了:

insert into demo (name, value) VALUES ("224", 1) ON duplicate KEY UPDATE value = value + 1;

那么首先事务2和事务3会被阻塞,然后事务1提交了,事务2和事务3就会发生死锁,其中一个爆出死锁的错误然后失败,另一个则成功执行。

原因

当insert … on duplicate key 执行成功之时,会在当前唯一键和之前唯一键之间加一个隐式GAP锁,如上会在222和333之间加上GAP锁,此时,事务2和事务3想插入新数据都会被GAP锁阻塞,此时GAP锁转为显式,事务2和事务3同时也分别想要获取X型的插入意向锁。

然后事务1提交,此时GAP锁并不会被释放,由于5.7的bug,事务2和事务3都会拿到GAP锁,此时他们去获取插入意向锁的时候由于GAP锁被对方拿到而矛盾,进而死锁。

解决方案

网上有很多方法,这里我提出一个另类的想法。

我们可以先用非事务的insert ignore去初始化数据,后面在用事务的update操作去更新。

参考:https://zhuanlan.zhihu.com/p/457191971

总结

到此这篇关于MySQL insert死锁问题的文章就介绍到这了,更多相关MySQL insert死锁问题内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯