仔细观察唯一索引的数据,可以看到 Session 1 插入的数据(abc-125-sz)在逻辑分布上与abc-130-sz是相邻的,通过多次尝试,可以确认这个 insert 语句不仅在当前插入的数据上加了锁,还在相邻的下一行数据上要加上 S 锁。 因此回顾 Session 2 的 insert 操作,会看到 insert 的操作中,刚好也有一行数据与 Session 1 发...
事务T2 insert into t7(id,a) values(40,9) 该语句插入的 a=9 ,需要先获取插入意向Gap锁(4,10),的值在 事务T1申请的gap锁(4,10)之间,故需事务T2的第二条insert语句要等待事务T1的Gaplock锁释放,在日志中显示 lock_mode X locks gap before rec insert intention waiting。所以,此时事务 T2 持有a...
从腾讯云给的结论看,死锁原因是TX1(已经持有了Next_key锁)和TX2(申请某个记录锁),两者出现了锁等待,进而导致TX2被回滚了。 3.1 造成死锁的事务 3.1.1 事务A 解读 事务A是一条insert语句,目的是批量写入数据 命中了唯一索引uniq_index_on_task_id_and_project_id_and_file_license_source 向记录(space id 51...
insert语句上锁的大致过程如下: 1、在行所在的间隙上申请“意向插入锁”。2、申请所要插入行的“排他锁”。3、如果在第二步的时候引发了唯一键冲突,那么陷入冲突的事务,要把上锁的过程分两步,先申请行的“共享锁”,然后再申请“排他锁”; 如果有多个事物陷入冲突,那么他们一定都会申请到“共享锁”,然后在申请...
insert 语句导致的死锁案例分析。 本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1. 准备工作 创建测试表: CREATE TABLE `t_deadlock_1` ( `id` int NOT NULL AUTO_INCREMENT, `i1` int DEFAULT NULL, `i2` int DEFAULT NULL, PRIMARY KEY (`id`), ...
1、死锁信息梳理 根据以上信息,发现是 dl_tab 执行insert操作导致死锁。初步梳理如下。 版本: 8.0.27 隔离级别: Read-Commited 表结构: *** 1. row *** Table: dl_tab Create Table: CREATE TABLE `dl_tab` ( `id` int NOT NULL AUTO_INCREMENT...
来不急多想,马上通过错误日志堆栈找到了发生死锁的sql语句,竟然是一条insert语句:“insert into ... on duplicate key update ...”,这直接戳中了我的盲区:insert也会导致死锁? 在正式介绍案例前我们先来看一下前置知识,这有助于后面的理解。 前置知识 ...
首先在分析死锁案例之前,我们先学习一下背景知识 insert 语句的加锁策略,来看看官方定义: "INSERT sets an exclusive lock on the inserted row. This lock is an index-record lock, not a next-key lock (that is, there is no gap lock) and does not prevent other sessions from inserting into the ...