MySQL死锁套路:一次诡异的批量插入死锁问题分析

摘要:线上最近出现了批量的死锁,百思不得姐。死锁记录如下第一反应是批量,的顺序不一样导致的死锁。什么是隐式锁隐式锁的意思就是没有锁在插入记录时,是不加锁的。

线上最近出现了批量insert的死锁,百思不得姐。死锁记录如下

出现问题的批量插入SQL中顺序是一模一样的,在顺序一样的情况下,只会进行插入等待(implicitlock转explicitX锁)下面有实验

如果是因为批量插入顺序不一致带来的死锁日志,打印的结果不是等待插入意向锁(insertintentionwaiting),下面有实验

现在采用一个简化的表,做实验

CREATETABLE`t1`(`id`int(11)NOTNULLAUTO_INCREMENT,`a`varchar(5)NOTNULLDEFAULT"",`b`varchar(5)NOTNULLDEFAULT"",PRIMARYKEY(`id`),UNIQUEKEY`uk_name`(`a`,`b`))ENGINE=InnoDB;实验01在记录不存在的情况下,两个同样顺序的批量insert同时执行,第二个会进行锁等待状态

首先truncatet1;

可以看到目前锁的状态

mysql>select*frominformation_schema.innodb_locks;+-------------+-------------+-----------+-----------+------------+------------+------------+-----------+----------+-----------+|lock_id|lock_trx_id|lock_mode|lock_type|lock_table|lock_index|lock_space|lock_page|lock_rec|lock_data|+-------------+-------------+-----------+-----------+------------+------------+------------+-----------+----------+-----------+|31AE:54:4:2|31AE|S|RECORD|`d1`.`t1`|`uk_name`|54|4|2|"1","1"||31AD:54:4:2|31AD|X|RECORD|`d1`.`t1`|`uk_name`|54|4|2|"1","1"|+-------------+-------------+-----------+-----------+------------+------------+------------+-----------+----------+-----------+在我们执行事务t1的insert时,没有在任何锁的断点处出现,这跟MySQL插入的原理有关系

insert加的是隐式锁。什么是隐式锁?隐式锁的意思就是没有锁

在t1插入记录时,是不加锁的。这个时候事务t1还未提交的情况下,事务t2尝试插入的时候,发现有这条记录,t2尝试获取S锁,会判定记录上的事务id是否活跃,如果活跃的话,说明事务未结束,会帮t1把它的隐式锁提升为显式锁(X锁)

源码如下

t2获取S锁的结果:DB_LOCK_WAIT

实验02批量插入顺序不一致的导致的死锁日志不是等待插入意向锁

写了一个代码去模拟,有很大概率会复现

funtest(){dao.delete()//对应deletefrom//sleepfor10msdao.insert()//对应insertignore}对应的SQL如下,注意是两个事务

begin;deletefromt1wherea="25"commit;begin;INSERTignoreINTO`t1`(`a`,`b`)VALUES("25","1")commit;这个代码在两个线程同时调用的时候,非常容易死锁。

如果标记为删除,说明事务已经提交,还没来得及purge,这时后面的事务加S锁等待;

在源码中打印一些日志。1.在storage/innobase/row/row0ins.c的row_ins_set_shared_rec_lock增加日志,可以看到对唯一索引增加S锁的过程

if(dict_index_is_clust(index)){err=lock_clust_rec_read_check_and_lock(0,block,rec,index,offsets,LOCK_S,type,thr);}else{err=lock_sec_rec_read_check_and_lock(0,block,rec,index,offsets,LOCK_S,type,thr);//增加如下日志fprintf(stderr,"row_ins_set_shared_rec_lock%s%lu%d",index->name,type,err);}2.在lock_rec_enqueue_waiting增加日志,可以看到锁等待的情况

staticenumdb_errlock_rec_enqueue_waiting({ fprintf(stderr,"lock_rec_enqueue_waiting:::::%s%lu",index->name,type_mode);}日志大概如下

row_ins_set_shared_rec_lockuk_name09(t1获取S锁成功)row_ins_set_shared_rec_lockuk_name09(t2获取S锁成功)lock_rec_enqueue_waiting:::::uk_name2563(t1X锁进如锁等待)lock_rec_enqueue_waiting:::::uk_name2563(t2X锁进如锁等待)其中2563=2048+512+3=LOCK_INSERT_INTENTION+LOCK_GAP+LOCK_X

这个过程跟非常经典的三个事务同时insert,一个回滚,剩下的两个事务一个成功,一个死锁,其实是一模一样的原理。

三个insertignore,一个回滚造成的死锁

insert语句都是insertignoreintot1(a,b)values("1","1");以下省略

死锁日志,跟我们案例中的一模一样

一个已提交但是未purge掉的记录会造成后续插入获取S共享锁,两个事务同时获取S锁,然后尝试获取插入意向锁,造成死锁

网上大神梳理的insert流程

首先对插入的间隙加插入意向锁(InsertIntensionLocks)

如果该间隙已被加上了GAP锁或Next-Key锁,则加锁失败进入等待;

如果没有,则加锁成功,表示可以插入;

然后判断插入记录是否有唯一键,如果有,则进行唯一性约束检查

如果不存在相同键值,则完成插入

如果存在相同键值,则判断该键值是否加锁如果没有锁,判断该记录是否被标记为删除

如果标记为删除,说明事务已经提交,还没来得及purge,这时加S锁等待;

如果没有标记删除,则报1062duplicatekey错误;

如果有锁,说明该记录正在处理(新增、删除或更新),且事务还未提交,加S锁等待;

插入记录并对记录加X记录锁;

上面是我debug源码得到的一些结论,如果我的理解有误的话,记得留言告诉我

THE END
1.风险提示诈骗手段不断翻新AI诈骗需警惕最近,2019防范治理电信网络诈骗论坛在中国互联网大会期间举行。据论坛内容显示,机器学习、人工智能、大数据等热点技术已被犯罪分子用于实施诈骗。比如上游黑产利用机器学习、人工智能,突破互联网企业的验证码体系,或是利用人工智能技术恶意注册,获取号码资源,提供给犯罪分子实施诈骗。 http://credit.wuzhi.gov.cn/news/content/1564100563622
2.8分钟戳穿UUOP受蚋萌绾巫跃惹朐独腧局1 、近年来,随着互联网技术的发展,网络诈.骗案件也越来越多,其中以约pao软件诱导刷单诈骗居多,当发现自己被骗的时候,不要等待平台方给您的承诺,不听信任何谣言,不要被吓唬,应该积极的采取行动。 2 、要避免成为这类骗局的受害者,首先需要提高自己的防范意识,不要轻易相信网络上来路不明的信息,不要为了一时的https://www.jianshu.com/p/ee3e1283a429
3.邀请被骗的局:JVMAO任务数据行骗广!人心不足蛇吞象当受害者放开手脚投“大单”后,诈骗分子立即抓住受害者不舍得已投入资金的心理,以系统故障、数据错误、操作失误等借口,欺骗受害者继续投入金钱,直至受害者发现被骗,对方便将其拉黑失联。网恋有风险,恋爱需谨慎!而今同城交友成为了很多人的选择,然而,所谓美女客服的甜言蜜语背后,可能隐藏着让你落入陷阱的危机。当心“交http://www.jujuwan.cn/52897.html
4.ForUMarstWu王小花高音质在线试听ForU歌词歌曲下载酷狗音乐为您提供由MarstWu、王小花演唱的高清音质无损For Ump3在线听,听For U,只来酷狗音乐!https://www.kugou.com/mixsong/24ux1e8e.html
5.315投诉消费投诉315曝光—中国质量万里行官网315online.com摩恩积极维护市场秩序 坚守高品质承诺 湖南澧县多举措助力生物医药化妆品项目落户 湖南省岳阳市“三个聚焦”推进集中整治见行见效 湖南张家界三部门联合打击肉类产品违法犯罪行为 湖南怀化开展特种设备及产品质量安全宣传服务进社区活动 消费提示:防止“积分到期兑换”套路欺诈的消费风险 http://315online.com/
6.奶酪清单(20241101)无套路脚本 点击“自动预览”后,可一键下载图片和 PDF。 文本选中复制 解除网站不允许复制的限制,已经适配多个主流文库网站。 Force Copy 浏览器扩展程序,集成文本选中复制与通用能力。 [本地] Wenku Doc Downloader 可导出所有图片,然后用文字识别工具获取文本。 道客巴巴 (测试) 简介 文本选中复制 解除网站不允许https://www.runningcheese.com/aaa
7.亚马逊转型独立站,从0到1的爆单指南!【壹】独立站营销活动高转化动作的三个步骤,从初期路转粉接触新客户,到巧设门槛增加客户购买量,再到利用VIP制度培养忠实客户,一步步地教会独立站卖家转化的“套路”。 一、路转粉:专属特惠让客户从不买到买 【1】专属首单优惠 方式:订阅弹窗/转盘抽奖/优惠券弹出/静态订阅栏/通栏直接写上首单优惠 https://www.cifnews.com/article/101484
8.m.eadcloud.cn/commercial/68672.htmlDownload LINE for Android 727.15MB 7%好评8952人) cheems的官网 多签钱包创建教程 苹果充游戏支付额度限制怎么取消 详情 nowt聊天软件 诈骗软件上的钱怎么才能提现 详情 TPLINK交换机最简单设置 鞋子商标图案大全 详情 最强修改器系统 小说类似软件 小说开头惊艳的神仙短句 p客产生的BV币值不值得http://m.eadcloud.cn/commercial/68672.html
9.m.lcaoyi.cn/giant/772227.htmlwww.poru..com http://xji.avcsm7.today/cn/home/web/index.php/vod/search/page/2/wd/%E4%B 打屁屁暗网 日本色情视频链接 外国三人做爱视频 少妇萝莉全国空降 极品少妇做爱 美女真露100 美女诱惑被插骑上位jcll 添添荫蒂视频免费观看 heitaotv888.vip htt://xji.avcsm7.today 白袜子http://m.lcaoyi.cn/giant/772227.html
10.中英对照:30个高频网络流行语11. 癞皮狗 (tiǎn gǒu) - someone who flatters excessively for attention or affection Example: 他总是对她癞皮狗般地奉承。 (He always flatters her like a dog for attention.) Translation: He always flatters her like a dog for attention. https://www.360doc.cn/article/76506922_1085564844.html
11.研究FC3000掌機的樵纯尚行?司徒开源/WhyCanForum(哇酷开发(struct fb_f1c500s_pdata_t * pdat, u32_t val) { uint8_t cnt=0; uint32_t tmp=read32(pdat->virtgpio + F1C500S_GPIOD_DATA); tmp&= ~(1 << 11); write32(pdat->virtgpio + F1C500S_GPIOD_DATA, tmp); for(cnt=0; cnt<9; cnt++){ tmp&= ~(1 << 10); if(val & 0xhttps://whycan.com/p_65140.html
12.CTF线下赛AWD套路小结= 0: # import pdb;pdb.set_trace() for filepath in diff_file_list: try: f = open(filepath, 'r').read() except Exception, e: break if Special_string not in f: try: print u'[*] webshell find : ' + getUnicode(filepath) shutil.move(filepath, os.path.join(Special_path['https://xz.aliyun.com/t/25
13.OpenStackAPI的使用套路分享OpenStack近期有openstack和vmware相关的开发需求,N年前从事虚拟化运维的时候玩过了,所以对它俩的API使用套路早忘得一干二净。这次借这个机会把使用套路做个文档并分享出来,希望可以帮到有需要的盆友。本篇先分享openstack的API使用套路,后续再分享vmware api的使用套路。在本篇中,只给出了1个小例子,更多例子可自行去写https://www.jb51.net/article/275520.htm