1、唯一键执行insert into on duplicate,在5.7.20版本无论插入数据表中是否存在,都会产生gap锁,其他等值操作在数据存在情况下不会产生gap锁,会退化为行锁 主键已经修复这个问题,不会产生gap锁,所以主键执行insert into on duplicate在这个版本不会有问题,亲测在5.7.35版本已经修复唯一键的问题 2、插入数据时如果唯...
1、唯一键执行insert into on duplicate,在5.7.20版本无论插入数据表中是否存在,都会产生gap锁,其他等值操作在数据存在情况下不会产生gap锁,会退化为行锁 主键已经修复这个问题,不会产生gap锁,所以主键执行insert into on duplicate在这个版本不会有问题,亲测在5.7.35版本已经修复唯一键的问题 2、插入数据时如果唯...
1.首先,执行事务1执行: begin; insert into song_rank(songId,weight) values(15,100) on duplicate key update weight=weight+1; 会获得 gap锁(10,20),insert intention lock(插入意向锁) 2.接着,事务2执行: begin; insert into song_rank(songId,weight) values(16,100) on duplicate key update weigh...
来不急多想,马上通过错误日志堆栈找到了发生死锁的sql语句,竟然是一条insert语句:“insert into ... on duplicate key update ...”,这直接戳中了我的盲区:insert也会导致死锁? 在正式介绍案例前我们先来看一下前置知识,这有助于后面的理解。 前置知识 1、记录锁 包含共享锁和独占锁 共享锁:简称S锁,当事务...
on duplicate key update…导致死锁 死锁模拟复现: 事务一执行: mysql> begin; //第一步 Query OK, 0 rows affected (0.00 sec) mysql> insert into song_rank(songId,weight) values(15,100) on duplicate key update weight=weight+1; //第二步 Query OK, 1 row affected (0.00 sec) mysql> roll...
insert into tb2002(c1,c2) values('d','2') ON DUPLICATE KEY UPDATE c3=c3+1; insert into tb2002(c1,c2) values('c','1') ON DUPLICATE KEY UPDATE c3=c3+1; insert into tb2002(c1,c2) values('d','1') ON DUPLICATE KEY UPDATE c3=c3+1;...
T3 insert into t(num,val) values(38,'38') on duplicate key update val='38'; T4 sess2 deadlock 2.4 死锁日志 *** (1) TRANSACTION: TRANSACTION 24064444, ACTIVE 17 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log...
开始今天的文章之前,先说明下昨天文章中的一个错误,昨天文章最后说replace into带来的死锁问题可以使用insert into duplicate key update的方法来解决,今天实际测试的时候,还是遇到了一些问题,改方法并没有完全解决死锁的问题,来看测试的结果。 首先,我们新建一个test表,其中包含3列,a,b,c,其中a是主键,b是唯一索引...
insert into t values(50,36,52,53) on duplicate key update c2=36; 会话2: start transaction; insert into t values(60,35,62,63) on duplicate key update c2=35; 这个时候会话2阻塞了,我们可以查看一下锁信息 另外开启一个会话3 show engine innodb status; ...
每个事务,就是每个insert duplicate语句,都加了gap锁 事务3,就是最晚的编号1858的事务,目前是在等事务1和事务2的gap锁。 重新整理事务1事务2事务3的执行过程中的锁情况,解释死锁的发生: 需要主要的点: 每个事务都是对(10,20)区间加gap锁,是都去加锁,而不是(10,20)区间上加一个锁然后各个事务获取这个锁。