面试-死锁

761 阅读2分钟

MySQL死锁会自动回滚吗

是的,MySQL中的死锁会自动回滚。当MySQL发现两个或更多事务在相互等待对方释放资源的时候,就会出现死锁。MySQL的默认行为是会自动回滚其中的一个事务,以便另一个事务继续运行并完成它的任务。据此,应用程序需要正确处理问题,重试事务,而不是依靠MySQL的自动回滚机制。

MySQL是如何检测死锁的

MySQL是通过两个方式来检测死锁的:

  1. 等待图

MySQL使用等待图算法来检测死锁。等待图是指一个数据库中正在运行的事务之间相互依赖的关系图。当一个事务在等待另一个事务占用的锁时,等待图就会生成。以此为基础,当一个事务等待另一个事务占用的资源时,就会在等待图上形成一条边。当等待图上出现环路的时候,就会发生死锁。

  1. 超时检查

MySQL会通过超时检查来定期扫描等待锁的事务。如果MySQL发现一个事务已经等待锁超过了一定的时间,通常是50秒,就会认为这个事务出现了死锁,然后自动进行回滚操作。

综上所述,MySQL使用以上两种方式一起检测死锁,以确保尽快发现并处理死锁情况。

那么回滚某一个事务的依据是什么

MySQL确定哪个事务回滚的依据与其内部的等待图和锁定信息有关。如果一个锁顺序导致不同的事务之间发生了循环依赖关系,则会形成一个死锁,并且MySQL将选择其中一个事务进行回滚,以解开死锁。

MySQL在检测到死锁时,会分析等待图,并根据相关事务之间的资源等待关系进行回滚。MySQL会找到在等待图上出现的环形依赖关系,并选择属于该环形依赖关系中的一条最短路径上的一个事务进行回滚。回滚的目的是打破死锁环,让其他事务能够继续执行,并且确保数据一致性。

需要注意的是,MySQL选择回滚的事务并不是随机产生的,而是会进行算法判断,以便让影响尽量少的事务回滚,从而最大程度地减少应用程序的影响和损失。