Mysql 死锁案例6-并发 insert on duplicate key 导致的死锁

场景复现

mysql 5.7.12 ,事务隔离级别RR

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE  KEY `a` (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

/*Data for the table `t` */

insert  into `t`(`id`,`a`,`b`) values 

(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);
事务1 事务2
T1

BEGIN;

INSERT  INTO `t`(`id`,`a`,`b`) VALUES (2,2,2)  ON DUPLICATE KEY UPDATE b =666

T2 BEGIN
INSERT  INTO `t`(`id`,`a`,`b`) VALUES (3,2,3) ON DUPLICATE KEY UPDATE b =666(阻塞)
T3 INSERT  INTO `t`(`id`,`a`,`b`) VALUES (3,3,3)  ON DUPLICATE KEY UPDATE b =666(阻塞)
T4 Deadlock found

SHOW ENGINE INNODB STATUS 死锁日志

------------------------
LATEST DETECTED DEADLOCK
------------------------
2024-03-14 00:56:54 0x1b5c
*** (1) TRANSACTION:
TRANSACTION 488617, ACTIVE 4 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s), undo log entries 1
MySQL thread id 24, OS thread handle 5388, query id 4322 localhost ::1 root update
INSERT  INTO `t`(`id`,`a`,`b`) VALUES (3,2,3) ON DUPLICATE KEY UPDATE b =666
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1087 page no 4 n bits 80 index a of table `test`.`t` trx id 488617 lock_mode X waiting
Record lock, heap no 8 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80000002; asc     ;;
 1: len 4; hex 80000002; asc     ;;

*** (2) TRANSACTION:
TRANSACTION 488616, ACTIVE 11 sec inserting
mysql tables in use 1, locked 1
4 lock struct(s), heap size 1136, 4 row lock(s), undo log entries 2
MySQL thread id 30, OS thread handle 7004, query id 4327 localhost ::1 root update
INSERT  INTO `t`(`id`,`a`,`b`) VALUES (4,1,1)  ON DUPLICATE KEY UPDATE b =666
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 1087 page no 4 n bits 80 index a of table `test`.`t` trx id 488616 lock_mode X locks rec but not gap
Record lock, heap no 8 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80000002; asc     ;;
 1: len 4; hex 80000002; asc     ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1087 page no 4 n bits 80 index a of table `test`.`t` trx id 488616 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 8 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80000002; asc     ;;
 1: len 4; hex 80000002; asc     ;;

*** WE ROLL BACK TRANSACTION (1)
------------
TRANSACTIONS

死锁分析

  1. T1事务1插入成功,加(0,2)和(2,5)间隙锁写锁、a=2的记录锁写锁和id=2的主键记录锁
  2. T2事务2插入数据发现冲突,申请(0,2]临键锁写锁( insert on duplicate key 语句发现冲突时是加冲突值的临键锁写锁),与事务1的记录锁冲突,阻塞
  3. T1事务1申请(0,2)意向插入锁,与事务2的临键锁冲突得等待,进入死锁

相关推荐

  1. 预防 MySQL 策略

    2024-03-14 09:30:03       28 阅读
  2. 2024-03-14 09:30:03       45 阅读
  3. 定义以及产生必要条件,处理

    2024-03-14 09:30:03       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-14 09:30:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-14 09:30:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-14 09:30:03       82 阅读
  4. Python语言-面向对象

    2024-03-14 09:30:03       91 阅读

热门阅读

  1. C# 中多线程锁的使用经验

    2024-03-14 09:30:03       37 阅读
  2. ffmpeg的使用不简单

    2024-03-14 09:30:03       36 阅读
  3. 小结:Node.js Express VS Koa

    2024-03-14 09:30:03       38 阅读
  4. AcWing 503. 借教室(每日一题)

    2024-03-14 09:30:03       46 阅读
  5. shell脚本中数组元素赋值

    2024-03-14 09:30:03       36 阅读
  6. 「jQuery系列」jQuery Cookie插件功能介绍

    2024-03-14 09:30:03       45 阅读
  7. 在 Amazon Bedrock 上使用 Anthropic Claude 系统 Prompt

    2024-03-14 09:30:03       42 阅读
  8. 小马哥yyds

    2024-03-14 09:30:03       41 阅读
  9. 2024-01-重学MySQL

    2024-03-14 09:30:03       33 阅读
  10. Horovod分布式深度学习框架

    2024-03-14 09:30:03       45 阅读