MST

星途 面试题库

面试题:MySQL如何检测和处理死锁

描述MySQL内部检测死锁的机制,以及当检测到死锁时,MySQL采取什么策略来处理死锁以保证数据库的一致性和可用性,同时说明这种处理策略对相关事务的影响。
45.0万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试

MySQL内部检测死锁的机制

  1. 等待图算法(Wait - for - Graph,WFG):MySQL使用等待图来检测死锁。在等待图中,每个事务是一个节点,如果事务T1等待事务T2持有的锁,那么就有一条从T1到T2的有向边。MySQL的死锁检测子系统会定期(或在特定操作时)检查等待图是否存在环。如果存在环,就意味着发生了死锁。例如,事务A等待事务B持有的锁,事务B等待事务C持有的锁,而事务C又等待事务A持有的锁,这样就形成了一个环,即死锁。

处理死锁的策略

  1. 选择牺牲者(Victim Selection):当检测到死锁时,MySQL会选择一个事务作为牺牲者(通常是回滚代价最小的事务)。回滚代价的衡量因素包括事务已经执行的时间、已经修改的行数等。MySQL会自动回滚这个牺牲者事务,释放它持有的所有锁。例如,假设事务T1已经执行了很长时间,修改了很多数据,而事务T2刚启动不久,修改的数据较少,那么事务T2更有可能被选为牺牲者。

对相关事务的影响

  1. 牺牲者事务:被选为牺牲者的事务会被回滚,该事务中已经执行的所有操作都将被撤销,之前修改的数据会恢复到事务开始前的状态。这意味着该事务的所有工作都白费了,需要重新执行。例如,如果牺牲者事务是向某个表中插入了100条记录,回滚后这100条记录将从表中删除。
  2. 其他相关事务:其他等待死锁解除的事务在牺牲者事务回滚并释放锁后,将能够继续执行。它们可以获取之前等待的锁,继续完成自己的操作,从而保证数据库的一致性和可用性。例如,事务T2等待事务T1持有的锁,当事务T1作为牺牲者回滚后,事务T2可以获取相应的锁,继续它的业务逻辑。