答案是:会
原因分析:
当我们在事务中,更新一条记录的时候,如果用到普通索引作为条件,那么会先获取普通索引的锁,然后再尝试获取主键索引的锁。
如果刚好在这时,有另外一个线程已经拿到了当前主键索引的锁,同时尝试去在该事务中去拿记录的普通索引的锁。 这时候就会发生死锁。
update tb set name = '123',age = 20 where name = 'test';
这个SQL会先对name加锁,然后再回表对id加锁。
--------------------------------------------------------
select * from tb where id = 15 for update;
update tb set age = 23 where name = 'test'
这个SQL会先对id加锁,然后再获取name的锁。
为了避免这种问题的发生,可以在程序中设置获得锁的顺序,例如只能按照先获得主键索引 --> 普通索引的顺序获取锁,避免死锁的发生。