面试题答案
一键面试MySQL内部检测死锁的机制
- 等待图算法(Wait - for - Graph,WFG):MySQL使用等待图来检测死锁。在等待图中,每个事务是一个节点,如果事务T1等待事务T2持有的锁,那么就有一条从T1到T2的有向边。MySQL的死锁检测子系统会定期(或在特定操作时)检查等待图是否存在环。如果存在环,就意味着发生了死锁。例如,事务A等待事务B持有的锁,事务B等待事务C持有的锁,而事务C又等待事务A持有的锁,这样就形成了一个环,即死锁。
处理死锁的策略
- 选择牺牲者(Victim Selection):当检测到死锁时,MySQL会选择一个事务作为牺牲者(通常是回滚代价最小的事务)。回滚代价的衡量因素包括事务已经执行的时间、已经修改的行数等。MySQL会自动回滚这个牺牲者事务,释放它持有的所有锁。例如,假设事务T1已经执行了很长时间,修改了很多数据,而事务T2刚启动不久,修改的数据较少,那么事务T2更有可能被选为牺牲者。
对相关事务的影响
- 牺牲者事务:被选为牺牲者的事务会被回滚,该事务中已经执行的所有操作都将被撤销,之前修改的数据会恢复到事务开始前的状态。这意味着该事务的所有工作都白费了,需要重新执行。例如,如果牺牲者事务是向某个表中插入了100条记录,回滚后这100条记录将从表中删除。
- 其他相关事务:其他等待死锁解除的事务在牺牲者事务回滚并释放锁后,将能够继续执行。它们可以获取之前等待的锁,继续完成自己的操作,从而保证数据库的一致性和可用性。例如,事务T2等待事务T1持有的锁,当事务T1作为牺牲者回滚后,事务T2可以获取相应的锁,继续它的业务逻辑。