Sql-Server
索引能否解決因鎖資源導致的 SQL 死鎖?
這個問題純粹與由於鎖定資源引起的死鎖有關。
我正在閱讀這篇文章:使用聚集索引解決 SQL Server 死鎖問題
他們已經解釋了添加非聚集索引或聚集索引如何解決死鎖問題。
一般的想法是 - UPDATE 查詢不會因為索引查找而阻塞,這將導致只有幾行被鎖定。
但是,SQL 伺服器的工作方式是 - 引擎在任何時候(例如在 5000 行級別鎖定 [來源:https ://www.youtube.com/watch?v= EqfAPZGKifA at 30:25])決定提升鎖定到頁級或表級鎖,從而鎖定整個對象(例如表)。那麼本文給出的解決方案——添加聚集索引是解決死鎖的一種方法——可靠嗎?
從根本上說,死鎖是一個性能問題。畢竟,無論程式碼的順序和所有其他常見的死鎖原因如何,如果所有事務都在任何其他事務開始之前完成,您將不會看到死鎖。
從根本上說,您最好還是修復導致死鎖的根本原因(通常但不總是,在不同事務中以不同順序訪問表),但只需進行性能調整即可修復很多死鎖。考慮到這一點,是的,正確的索引絕對可以減少您遇到的死鎖數量。
儘管與其他任何事情一樣,它確實取決於您的程式碼、問題的程度、選擇的索引、負載、隨時間的變化、統計資訊以及所有可能影響性能的因素。
套用托爾斯泰的話說“所有快樂的數據庫都是相似的,每個不快樂的數據庫都以自己的方式不快樂”。(從某人那裡偷來的,但不記得要歸功於 - 抱歉)。我的意思是有很多種死鎖,每種都需要自己的解決方案,但是添加索引肯定是更常見的補救措施之一。請注意,您只能通過獨占鎖獲得死鎖,並且在 OLTP 系統中修改超過 5000 行的情況應該很少見。