MYSQL死锁问题

如果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