Sql-Server

主鍵對阻塞情況的影響

  • August 7, 2018

我正在研究“事務和並發”、“死鎖”和相關的東西一段時間。我有一個關於這個問題的問題。

情況是兩個記錄 (AccountNumber AW00012597AW00012596) 由兩個不同的會話更新:

  • 第 60 節:
begin transaction
update CustomerTest
set ModifiedDate = getdate()
where accountnumber = 'AW00012597'    
  • 第 63 課:
begin transaction
update CustomerTest
set ModifiedDate = getdate()
where accountnumber = 'AW00012596'

問題是當我在列上放置一個聚集索引AccountNumber(或將此列設置為 PrimaryKey)時,兩個事務都完成沒有任何問題,但是當我刪除索引時(當表沒有任何索引或主鍵時)會話 63 被阻塞! !

我想知道這背後的具體原因是什麼?因為事務正在更新不同的行,並且它們在不同的行上持有“獨占鎖”(根據我目前所讀的內容)。那麼聚集索引的作用是什麼?

預先感謝

社區 wiki 答案- 請編輯以改進:

原因是當您創建索引時,無論是專門創建索引還是通過將其聲明為主鍵(在內部創建一個索引以強制執行約束),它都會使兩個更新語句快速,並且它們可以快速完成而不會阻塞。

沒有索引,每個查詢都必須掃描所有記錄以找到您在where子句中指定的內容,因此存在阻塞,我猜這最終會消失。或者是鎖升級:沒有索引,它必須升級到表鎖,這就是阻塞。您確實需要查看塊/死鎖佔用的資源以了解發生了什麼*。*

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