索引可以解决由于锁资源导致的SQL死锁吗?

var*_*ble 4 sql-server deadlock sql-server-2019

这个问题纯粹是由于锁资源导致的死锁。

我正在阅读这篇文章:使用聚集索引解决 SQL Server 死锁问题

他们解释了如何添加非聚集索引或聚集索引解决死锁问题。

一般的想法是 - UPDATE 查询不会因为索引查找而阻塞,这将导致只有少数行被锁定。

然而,SQL Server 的工作方式是 - 引擎在任何时刻(例如在 5000 个行级锁之后 [来源:https ://www.youtube.com/watch ?v=EqfAPZGKifA at 30:25])决定提升lock 为页级锁或表级锁,从而锁定整个对象(例如表)。那么本文给出的解决方案——添加聚集索引是解决死锁的办法——可靠吗?

Gra*_*hey 6

从根本上来说,死锁本质上是一个性能问题。毕竟,无论代码的顺序和所有其他常见死锁原因如何,如果所有事务在任何其他事务开始之前完成,您就不会看到死锁。

从根本上来说,最好的方法仍然是修复导致死锁的根本原因(通常但并非总是在不同事务中以不同顺序访问表),但只需进行性能调整即可修复大量死锁。考虑到这一点,是的,正确的索引绝对可以减少您遇到的僵局数量。

尽管与其他任何事情一样,它确实取决于您的代码、问题的程度、选择的索引、负载、随时间的变化、统计数据以及所有可能影响性能的因素。