千家信息网

【Mysql】两条insert 语句产生的死锁

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,背景:查看status日志发现两条insert 出现了死锁RECORD LOCKS space id 388 page no 27032 n bits 616 index `idx_svcorders
千家信息网最后更新 2026年10月31日【Mysql】两条insert 语句产生的死锁背景:查看status日志发现两条insert 出现了死锁
  1. RECORD LOCKS space id 388 page no 27032 n bits 616 index `idx_svcorderserviceitem_workorderid_quantity` of table `ecejservice`.`svc_order_service_item` trx id 596252578 lock_mode X insert intention waiting
可以确定,这个x锁不是由于INSERT产生的,因为 INSERT可能产生的锁包括检查dup key时的s锁,隐式锁转换为显式锁(not gap,要在二级索引上产生lock_mode为X的LOCK_ORDINARY类型的锁(包括记录及记录前面的gap),据我所知一般是根据二级索引扫描进行记录更新导致的。

3. 根据
LOCK WAIT 14 lock struct(s), heap size 2936, 7 row lock(s), undo log entries 7
有7个undo entires,而单纯的INSERT一条记录只有一个undo entry,因此可以推断除了INSERT,必然还有别的操作

基于以上,事务除了INSERT,可能还存在DELETE/UPDATE,并且这些操作是走的二级索引来查找更新记录。

一个简单但不完全相同的重现步骤: DROP TABLE t1; CREATE TABLE `t1` ( `a` int(11) NOT NULL AUTO_INCREMENT, `b` int(11) DEFAULT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`a`), KEY `b` (`b`) ) ENGINE=InnoDB ; insert into t1(a, b,c) values(1,2,3),(5,4,6),(8, 7,9),(12,12,19),(15,15,11);

session1:

begin; delete from t1 where b = 12; //二级索引上lock_mode X、lock_mode X locks gap before rec以及主键上的lock_mode X locks rec but not gap 二级索引:heap_no=5, type_mode=3 (12上的LOCK_ORDINARY类型锁,包括记录和记录前的GAP) 聚集索引:heap_no=5,type_mode=1027 二级索引:heap_no=6,type_mode=547(15上的GAP锁) session2: begin; delete from t1 where b = 7; //二级索引上lock_mode X、lock_mode X locks gap before rec以及主键上的lock_mode X locks rec but not gap 二级索引:heap_no=4,type_mode=3 (7上的LOCK_ORDINARY类型锁,包括记录和记录前的GAP) 聚集索引:heap_no=4,type_mode=1027 二级索引:heap_no=5,type_mode=547 (记录12上的GAP锁) session1: insert into t1 values (NULL, 6,10); //新插入记录聚集索引无冲突插入成功,二级索引等待插入意向锁(lock_mode X locks gap before rec insert intention waiting) 二级索引,heap_no=4, type_mode=2819 (请求记录7上面的插入意向锁LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION, 需要等待session2 session2: insert into t1 values (NULL, 7,10); 二级索引:heap_no=5, type_mode=2819 (请求记录12上的插入意向锁LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION,需要等待session1) 互相等待,导致发生死锁 从打印的死锁信息来看,基本和线上发生的死锁现象是一致的。


再举一个例子
  1. mysql> select * from test01;
  2. +----+-----+
  3. | id | app |
  4. +----+-----+
  5. | 1 | 01 |
  6. | 2 | 02 |
  7. | 5 | 03 |
  8. | 10 | 03 |
  9. | 6 | 04 |
  10. | 7 | 05 |
  11. | 8 | 06 |
  12. | 9 | 06 |
  13. | 11 | 06 |
  14. | 12 | 07 |
  15. | 13 | 08 |
  16. | 14 | 09 |
  17. | 15 | 09 |
  18. +----+-----+
  19. 13 rows in set (0.00 sec)

  • session1:
  • mysql> select now();start TRANSACTION;
  • +---------------------+
  • | now() |
  • +---------------------+
  • | 2018-01-25 16:08:46 |
  • +---------------------+
  • 1 row in set (0.00 sec)

  • Query OK, 0 rows affected (0.00 sec)

  • mysql> select * from test01 where app='05' for update; ---第1步 锁住【6.04】-【7.05】以及【7.05】-【8.06】 两段区间
  • +----+-----+
  • | id | app |
  • +----+-----+
  • | 7 | 05 |
  • +----+-----+
  • 1 row in set (0.00 sec)

  • mysql> insert into test01(app) values ('07'); --第三步 等待第二步释放
  • Query OK, 1 row affected (23.24 sec)



  • session2:
  • mysql> select * from test01 where app='08' for update; --第二步 锁住【12,07】-【13,08】以及【13,08】-【14,09】两段区间
  • +----+-----+
  • | id | app |
  • +----+-----+
  • | 13 | 08 |
  • +----+-----+
  • 1 row in set (0.00 sec)

  • mysql> insert into test01(app) values ('04'); ----第四步 等待第一步释放,,于是死锁
  • ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction


  • 查看死锁日志:
    1. LATEST DETECTED DEADLOCK
    2. ------------------------
    3. 2018-01-25 16:09:54 0x7f07d23ff700
    4. *** (1) TRANSACTION:
    5. TRANSACTION 5375, ACTIVE 51 sec inserting
    6. mysql tables in use 1, locked 1
    7. LOCK WAIT 5 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
    8. MySQL thread id 2294, OS thread handle 139671567841024, query id 42463 localhost root update
    9. insert into test01(app) values ('07')
    10. *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    11. RECORD LOCKS space id 64 page no 4 n bits 80 index idx_app of table `devops`.`test01` trx id 5375 lock_mode X locks gap before rec insert intention waiting
    12. Record lock, heap no 12 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
    13. 0: len 2; hex 3038; asc 08;;
    14. 1: len 4; hex 0000000d; asc ;;

    15. *** (2) TRANSACTION:
    16. TRANSACTION 5376, ACTIVE 38 sec inserting
    17. mysql tables in use 1, locked 1
    18. 5 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 1
    19. MySQL thread id 2293, OS thread handle 139671568905984, query id 42464 localhost root update
    20. insert into test01(app) values ('04')
    1. *** (2) HOLDS THE LOCK(S):
    1. RECORD LOCKS space id 64 page no 4 n bits 80 index idx_app of table `devops`.`test01` trx id 5376 lock_mode X
    2. Record lock, heap no 12 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
    3. 0: len 2; hex 3038; asc 08;;
    4. 1: len 4; hex 0000000d; asc ;;

    5. *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
    6. RECORD LOCKS space id 64 page no 4 n bits 80 index idx_app of table `devops`.`test01` trx id 5376 lock_mode X locks gap before rec insert intention waiting
    7. Record lock, heap no 6 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
    8. 0: len 2; hex 3035; asc 05;;
    9. 1: len 4; hex 00000007; asc ;;

    10. *** WE ROLL BACK TRANSACTION (2)
    11. ------------

    死锁日志是不是和上面的一样?



    参考:
    http://blog.itpub.net/22664653/viewspace-2145068/ ----杨奇龙
    http://www.sohu.com/a/169663059_610509 ---insert ..select 语句产生死锁
    http://blog.itpub.net/7728585/viewspace-2146183/ ---insert ..select 语句产生死锁--八怪
    索引 死锁 意向 日志 类型 语句 区间 面的 更新 相同 一致 成功 事务 例子 信息 只有 必然 所知 步骤 现象 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网企业 科技金融是不是互联网金融 猪兼强互联网科技 互联网 卓越科技 苏州互联网科技贷款公司 智腾互联网科技有限公司 互联网科技扶贫时间 中国科技创新与世界互联网大会 中国互联网公司排名锤子科技 美国互联网科技实力 每天都有哪些好的互联网科技 智帮互联网科技公司最近动向 互联网科技数字货币 西安有哪些互联网高科技企业 抖集互联网科技技术咨询 福仕德教育科技互联网 科技信息时代互联网发展 华人运通互联网科技公司 上海互联网科技园景观 东风日产互联网科技公司叫什么 湖北九亚互联网络科技有限公司 深圳市人人互联网科技有限公司 互联网 视角下的科技创新 坤平互联网科技 互联网行业科技股 济南有互联网科技公司吗 保险科技服务互联网营销体系 伍佰万互联网科技怎么赚钱 卡尔迅互联网科技有限公司 上海乐五互联网科技有限公司
    0