当session1执行insert into tb select 15;,session1 已获取到IX锁,gap锁, 等待rec insert intention(插入意向锁), session1, session2 都在等待插入意向锁, 插入意向锁与gap锁冲突,双方都没有释放gap锁,又都在等待插入意向锁,死锁发生。 LATESTDETECTEDDEADLOCK --- 2018-11-03 17:15:110x7f4b0e7ea700 *...
STARTTRANSACTION;INSERTINTOusers(name,email)VALUES('Bob','bob@example.com');-- 这里假设事务B在此处需要获取某个锁,导致事务A无法继续执行DELETEFROMusersWHEREid=2;COMMIT; 1. 2. 3. 4. 5. 6. 7. 8. 死锁的发生 在上述示例中,当事务A执行到DELETE语句时,它会获取对users表中id为1的行的锁。同时...
INSERTINTOstudent (no,name)VALUES(21, "Zhoubing"); 此时session 1阻塞(因为session 2持有区间锁), 如图: Image 3 session 2: INSERTINTOstudent (no,name)VALUES(22, "Zhoubing"); 此时session 2死锁(因为session 1持有区间锁), 如图: Image 4 . 总结, delete之后进行insert有可能发生死锁, 因为delete可...
即在update、delete语句后会产生间隙锁和Next-key lock,如果在并发下,存在两个事务都事前执行了UPDATE语句(各自持有了gap lock),当INSERT时,要先在插入间隙上获取插入意向锁,由于插入数据的间隙存在冲突,所以会互相等待获取插入意向锁,即相互竞争,最终会导致一方死锁。
INSERT INTO student(no,name)VALUES(22,"Zhoubing"); 此时session 2死锁(因为session 1持有区间锁), 如图: Image 4 . 总结, delete之后进行insert有可能发生死锁, 因为delete可能会持有区间锁, 而区间锁是可重入的(只要不是插入数据). 解决方案:
从信息中可以看到,死锁发生时的语句为两个 Insert 语句。通过审计的方式,找到这个 insert 操作属于一个业务请求发起的事务,由一个 delete 语句和 insert 语句构成。 测试环境复现 表和数据可以参考如下语句进行生成: 代码语言:txt 复制 CREATE TABLE `t` ( ...
insert (3,3,5) 申请lock S 被sess2 delete 持有的Lock X 行锁阻塞, show engine innodb status 并没有完整的显示 该lock S 是什么锁。我们继续测试。 测试案例二 T1 sess1 mysql > delete from t where a=3 and b=3 ; mysql > insert into t(a,b,c) values(3,3,5); ...
MySQL死锁案例分:先delete,再insert,导致死锁⼀、死锁案例 MySQL版本:Percona MySQL Server 5.7.19 隔离级别:可重复读(RR)业务逻辑:并发下按某个索引字段先delete记录,再insert记录 ⽐如:1.begin;2.delete from tb where order_id = xxx;3.insert into tb(order_id) values(xxx);4.commit;⼆...
事务2 中的session_endpoint表在执行insert操作的时候被阻塞了,而且这条插入SQL在等待插入意向锁(lock_mode X locks gap before rec insert intention waiting) *** (2) TRANSACTION: TRANSACTION 272193, ACTIVE 0 sec inserting mysql tables in use 1, locked 1 ...
INSERT / UPDATE / DELETE:加排他(X)锁 当前读在 RR 和 RC 两种隔离级别下的实现也是不一样的:RC 只加记录锁,RR 除了加记录锁,还会加间隙锁,用于解决幻读问题。 不同SQL 语句对加锁的影响 不同的 SQL 语句当然会加不同的锁,总结起来主要分为五种情况: ...