面试题答案
一键面试常见业务场景或操作场景及死锁原因
- 并发更新操作
- 场景:多个事务同时对相同的行数据进行更新操作。例如,事务A更新用户表中ID为1的用户余额,事务B也同时更新该用户的余额。
- 原因:假设事务A先获取ID为1的行锁,准备更新余额,此时事务B也请求获取ID为1的行锁。如果事务B等待事务A释放锁,而事务A又需要获取其他资源(比如另一个用户的行锁)才能完成操作,同时事务B也持有其他资源,两个事务互相等待对方释放资源,就会形成死锁。
- 不同顺序的锁获取
- 场景:多个事务以不同顺序获取锁。例如,事务A先获取表A的锁,再获取表B的锁;事务B先获取表B的锁,再获取表A的锁。
- 原因:当事务A获取表A的锁后,事务B获取表B的锁,然后事务A尝试获取表B的锁,事务B尝试获取表A的锁,此时两个事务都在等待对方释放锁,从而导致死锁。
- 锁升级
- 场景:在高并发环境下,大量小粒度锁(如行锁)请求升级为大粒度锁(如表锁)。例如,许多事务同时对表中的不同行进行操作,每个事务先获取行锁,随着并发量增加,MySQL可能会将行锁升级为表锁。
- 原因:如果有部分事务已经持有行锁,并且在等待锁升级,而其他事务又在请求获取表锁或者其他行锁,就可能出现死锁。因为升级锁的事务等待其他事务释放行锁以完成升级,而其他事务又在等待升级后的锁,形成循环等待。
- 长事务与高并发
- 场景:存在长事务(执行时间较长的事务),同时系统处于高并发状态。例如,一个事务需要处理大量数据的复杂计算和更新操作,执行时间较长,期间其他事务不断请求相关资源。
- 原因:长事务长时间持有锁资源,其他事务长时间等待。在高并发情况下,很容易出现其他事务为了获取所需资源而与长事务形成互相等待的情况,进而导致死锁。