在 MySQL 中,死锁检测是通过等待图(wait-for graph)来实现的。MySQL 使用图算法来检测死锁,其中包括老版本的深度优先遍历和新版本的稀疏等待关系图。
老版本的深度优先遍历: 在老版本的 MySQL 中,死锁检测主要依赖于深度优先遍历等待图。当一个事务请求资源被阻塞时,MySQL 将其加入等待图中,并尝试通过深度优先遍历来检测是否存在环,如果存在环,就表示发生了死锁。
这种方法的缺点是可能会造成性能开销,因为深度优先遍历可能需要遍历大量的节点。
新版本的稀疏等待关系图: 为了降低死锁检测的性能开销,MySQL 在新版本中引入了稀疏等待关系图。这种图的特点是只包含一小部分节点,即那些可能导致死锁的节点。这样就能够更有效地检测死锁,减少性能开销。
具体来说,MySQL 使用 "waits-for graph" 来表示事务之间的等待关系。当一个事务请求某个资源时,它将被加入到等待图中,而等待图只包含涉及到等待关系的节点,而不是所有事务的节点。这使得死锁检测更加高效。
总体而言,MySQL的死锁检测是通过构建等待图,然后使用图算法检测图中是否存在环来实现的。新版本引入的稀疏等待关系图减少了性能开销,提高了死锁检测的效率。