Sql-Server

選擇語句的死鎖

  • June 15, 2016

我從 2 個選擇語句中陷入僵局。這是什麼原因?我該如何解決這個問題?

在此處輸入圖像描述

Deadlocked processes:   11278 
Victim process: 5185
Lock type:  Index/(Key)

兩個查詢是一樣的

對象:unicas_ux.dbo.Course,鎖定模式:獨占(X),索引:NCIDX_Course_TermId

(@P0 bigint)選擇 courses0_.TermId 作為 TermId17_130_1_,courses0_.Id 作為 Id1_45_1_,courses0_.Id 作為 Id1_45_0_,courses0_.ConvertedGrade 作為 Converte2_45_0_……courses0_.VerifiedCredits 作為 Verifie14_45_0_,courses0_.VerifiedDate 作為 Verifie15_45_0_,課程0_.VerifiedGrade作為 Verifie16_45_0_ 從 dbo.Course courses0_ where courses0_.TermId=@P0 order by courses0_.CreatedDate asc

當一個查詢在一個對象(行、數據頁、範圍、表等)上獲得鎖並且其他資源嘗試訪問它時,就會發生死鎖。SQL Server 中最小的單元是數據頁,SQL 在處理頁時會鎖定頁。所以,是的,兩個 select 語句可能會造成死鎖。

解決方案

  1. WITH(NOLOCK) - 如果你的數據可以被臟讀
  2. 使用讀取送出的快照或快照隔離
  3. 盡量保持小批量交易
  4. 使用綁定連接- 它將允許兩個連接使用相同的事務和鎖

此答案基於您的問題,因為您的螢幕截圖不包含任何資訊。

這是死鎖的快速定義

  • 查詢 1 已鎖定表 1,並希望訪問表 2
  • 查詢 2 已鎖定表 2,並希望訪問表 1

這造成了永遠無法解決的局面。每個查詢都將等待直到它可以訪問另一個表,直到查詢被取消、連接被終止或實例關閉。SQL Server 注意到這一點並將其中一個作為deadlock victim. 請注意,Table 1orTable 2可能只是表的一部分,甚至是同一個表的一部分。

解決方案是不同時執行查詢,使它們執行得更快/持有鎖的時間更短,或者修改查詢以不使用其他表。

如果沒有實際的查詢,就無法為您提供更具體的建議。

**編輯:**根據您上面給出的查詢部分(注意中間有一個….,這讓我認為這不是整個查詢)我很好奇還有什麼事情發生在。您要求對 select 語句進行排他鎖。如果沒有查詢提示,這是相當不尋常的。在此之前是否有帶有附加查詢的交易?你能給我們表/索引結構嗎?

引用自:https://dba.stackexchange.com/questions/106354