如果insert或update用到了同样的索引也会造成死锁。 比如 update table_a set name = ‘test1’ where id = 300; //用到了table_a的id主键索引 insert into table_b (a_id,`name`) (select id,name from table_a where id >=200) ON DUPLICATE KEY UPDATE a_id = values(a_id)//同样用到了table_a的id主键 所以会导致死锁。
行级锁并不是直接锁记录,而是锁索引,如果一条SQL语句用到了主键索引,mysql会锁住主键索引;如果一条语句操作了非主键索引,mysql会先锁住非主键索引,再锁定主键索引。
排查可以执行如下命令查看
show engine innodb status