有趣的insert死锁
昨天看到一个很有意思的死锁,拿来记录下:
环境:deadlock on
事务隔离级别: read commited
表结构:
root@test 08:34:01>show create table lingluo\G *************************** 1. row ***************************Table: lingluo Create Table: CREATE TABLE `lingluo` (`a` int(11) NOT NULL DEFAULT '0',`b` int(11) DEFAULT NULL,`c` int(11) DEFAULT NULL,`d` int(11) DEFAULT NULL,PRIMARY KEY (`a`),UNIQUE KEY `uk_bc` (`b`,`c`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk 1 row in set (0.00 sec)
session 1:
root@test 08:45:51>select * from lingluo; +--------+------+------+------+ | a | b | c | d | +--------+------+------+------+ | 1 | 2 | 3 | 4 | | 500 | 100 | 200 | 43 | | 1000 | 10 | 20 | 43 | | 10001 | 21 | 21 | 32 | | 100202 | 213 | 213 | 312 | | 100212 | 214 | 214 | 312 | +--------+------+------+------+ 6 rows in set (0.00 sec)root@test 08:46:38>begin; Query OK, 0 rows affected (0.00 sec)root@test 08:47:04>insert into lingluo values(100213,215,215,312); Query OK, 1 row affected (0.00 sec)
session 2:
root@test 08:46:02>begin; Query OK, 0 rows affected (0.00 sec)root@test 08:47:20>insert into lingluo values(100214,215,215,312); Query OK, 1 row affected (12.77 sec)
session3:
root@test 08:46:24>begin; Query OK, 0 rows affected (0.00 sec)root@test 08:47:23>insert into lingluo values(100215,215,215,312);
session 1 rollback前:
---TRANSACTION 4F3D6F33, ACTIVE 3 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1 MySQL thread id 18124715, OS thread handle 0x7fea34912700, query id 1435660081 localhost root update insert into lingluo values(100215,215,215,312) ------- TRX HAS BEEN WAITING 3 SEC FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6F33 lock mode S waiting ------------------ TABLE LOCK table `test`.`lingluo` trx id 4F3D6F33 lock mode IX RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6F33 lock mode S waiting ---TRANSACTION 4F3D6D24, ACTIVE 5 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1 MySQL thread id 18124702, OS thread handle 0x7fe706fdf700, query id 1435659684 localhost root update insert into lingluo values(100214,215,215,312) ------- TRX HAS BEEN WAITING 5 SEC FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6D24 lock mode S waiting ------------------ TABLE LOCK table `test`.`lingluo` trx id 4F3D6D24 lock mode IX RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6D24 lock mode S waiting ---TRANSACTION 4F3D4423, ACTIVE 33 sec 2 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1 MySQL thread id 18124692, OS thread handle 0x7fe73c89a700, query id 1435651549 localhost root TABLE LOCK table `test`.`lingluo` trx id 4F3D4423 lock mode IX RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D4423 lock_mode X locks rec but not gap
/****
session 1上的转为显式锁:lock_mode X locks rec but not gap
session 2等待的锁:lock mode S waiting
session 3等待的锁:lock mode S waiting
***/
session 1 rollback
session 2插入成功
session 3:
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
这个时候show engine innodb status:
5 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 1 MySQL thread id 18124702, OS thread handle 0x7fe706fdf700, query id 1435659684 localhost root TABLE LOCK table `test`.`lingluo` trx id 4F3D6D24 lock mode IX RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6D24 lock mode S RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6D24 lock mode S RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6D24 lock_mode X insert intention RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6D24 lock mode S locks gap before rec
死锁信息:
------------------------ LATEST DETECTED DEADLOCK ------------------------ 130701 20:47:57 *** (1) TRANSACTION: TRANSACTION 4F3D6D24, ACTIVE 13 sec inserting, thread declared inside InnoDB 1 mysql tables in use 1, locked 1 LOCK WAIT 4 lock struct(s), heap size 1248, 2 row lock(s), undo log entries 1 MySQL thread id 18124702, OS thread handle 0x7fe706fdf700, query id 1435659684 localhost root update insert into lingluo values(100214,215,215,312) *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6D24 lock_mode X insert intention waiting *** (2) TRANSACTION: TRANSACTION 4F3D6F33, ACTIVE 11 sec inserting, thread declared inside InnoDB 1 mysql tables in use 1, locked 1 4 lock struct(s), heap size 1248, 2 row lock(s), undo log entries 1 MySQL thread id 18124715, OS thread handle 0x7fea34912700, query id 1435660081 localhost root update insert into lingluo values(100215,215,215,312) *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6F33 lock mode S *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 3351 page no 4 n bits 80 index `uk_bc` of table `test`.`lingluo` trx id 4F3D6F33 lock_mode X insert intention waiting *** WE ROLL BACK TRANSACTION (2)
原因:
s1 , type_mode=1059 //s2为s1转换隐式锁为显式锁
s2, type_mode=1282 //检查重复键,需要加共享锁,被s1 block住,等待S锁
s3, type_mode=1282 // 被s1 block住,等待S锁
s1, type_mode=547 //s1回滚,删除记录,lock_update_delete锁继承,
s2, type_mode=546 //创建s锁 LOCK_GAP | LOCK_REC | LOCK_S
s3, type_mode=546 //创建s锁 LOCK_GAP | LOCK_REC | LOCK_S
s2, type_mode=2819 // LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION
s3, type_mode=2819 // LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION
当s1回滚后,s2和s3获得s锁,但随后s2和s3又先后请求插入意向锁,因此锁队列为:
s2(S GAP)<—s3(S GAP)<—s2(插入意向锁)<–s3(插入意向锁) s3(s锁),s2(x锁),s3(x锁)形成死锁。
这样的死锁不光出现在unique key,还包括primary key(unique key的特殊形式)
印风的博客里有更详细的代码级别的记录,有兴趣的可以看下
另外如果:deadlock off的话,即使session 1rollback了,session 2和session 3还是处于等待的状态,除非超过了innodb_lock_wait_timeout的时间,报
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
这个情况和官方的这篇文章是一样的http://dev.mysql.com/doc/refman/5.5/en/innodb-locks-set.html
转载于:https://www.cnblogs.com/sunss/p/3166550.html
有趣的insert死锁相关推荐
- mysql并发插入死锁_高并发下insert死锁 · Issue #ITUNR · baomidou/mybatis-plus - Gitee.com...
当前使用版本(必须填写清楚,否则不予处理) springboot版本:2.0.3.RELEASE mybatis版本:3.0.5 jdk:1.8 该问题是怎么引起的?(最新版上已修复的会直接close ...
- mysql insert锁机制
一.前言 上周遇到一个因insert而引发的死锁问题,其成因比较令人费解. 于是想要了解一下insert加锁机制,但是发现网上介绍的文章比较少且零散,挖掘过程比较忙乱. 本以为只需要系统学习一个较完全 ...
- insert 锁表 mysql_mysql insert锁机制【转】
最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...
- MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)
MySQL事务原理分析(ACID特性.隔离级别.锁.MVCC.并发读异常.并发死锁以及如何避免死锁) 一.事务 目的 组成 特征 事务空间语句 二.ACID特性 原子性(A) 隔离性(I) 持久性(d ...
- mysql数据库连接锁住_锁mysql方法
Mysql锁初步 存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指 ...
- mysql innodb 间隙锁_Mysql innodb 间隙锁
前段时间系统老是出现insert死锁,很是纠结.经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围.间隙锁的主要作用是为了防止出现 ...
- Mysql innodb 间隙锁
前段时间系统老是出现insert死锁,很是纠结.经过排查发现是间隙锁!间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围.间隙锁的主要作用是为了防止出现 ...
- 《深入理解MySQL主从原理32讲》推荐篇
导读: 作者:高鹏(网名八怪),<深入理解MySQL主从原理32讲>系列文的作者.2008年开始至今一直从事Oracle/MySQL相关工作,现任易极付高级DBA,Oracle Ocm. ...
- Linux服务器上监控网络带宽工具大全
点击上方"阿拉奇学Java",选择"置顶或者星标" 每天早晨07点28分, 与你相约! 原文:http://t.cn/8s9OFR2 推荐阅读 | [漫画]80 ...
最新文章
- Windows/Linux下引用jar包,并用javac/java编译运行
- Android studio之导入新库提示Add library ‘Gradle*****@aar‘ to classpath
- wpf之界面控件MaterialDesignInXAML
- 电脑W7系统怎样安装鸿蒙系统,家用电脑升级win7系统的操作方法
- 杰理AD14N/AD15N---外置Flash烧录音乐文件
- 2022年更新正大杯市场调查与分析大赛现场答辩问题总结注意事项和PPT板块资料经验分享
- 华为网络设备查看电源状态检查命令
- ios 截屏保存图片
- 问佛__如果浮躁了,静下来看看,慢慢体会下
- 邓元鋆:AMD的方法论
- 每个汉字在DB2数据库中占多少个字节?
- 手机上有哪些可以记录生日倒计时天数的软件?
- Python+WebKit+HTML开发桌面应用程序
- 聊聊并发(10)生产者消费者模式
- 【05】制作鸿蒙版蜻蜓短视频系统-事件原理及完成点击,长按,双击等操作实现跳转-优雅草伊凡
- 【颜色空间转换大集合】RGB到YIQ,RGB到HSI和HSI到RGB,RGB到YcbCr,RGB到XYZ颜色转换matlab代码的Demo,含详细的解释
- 接口规范、容错处理规则、aph备份数据规则
- 好压打开包含solidworks文件的压缩包时非常卡顿
- RTT_0.96寸OLED_IIC驱动
- Pymol指令大全。官方社区——海量Pymol作图的代码
热门文章
- memcached 安装小结-1
- 通过 yar 初识RPC
- 使用URL在线语音合成
- Apache htaccess的简单总结,以及参数的使用
- 四则运算之Right-BICEP测试
- 简明Vim练级攻略(转)
- MapXtreme 安装、编码及打包注意事项
- WPF 放大镜(Magnifying Glass)
- 服务器如何导入数据库文件格式,服务器如何导入数据库文件格式
- vue报错vue-router.esm.js?8c4f:2062 Uncaught (in promise) Error: Avoided redundant navigation to curren