Sql-Server
主鍵對阻塞情況的影響
我正在研究“事務和並發”、“死鎖”和相關的東西一段時間。我有一個關於這個問題的問題。
情況是兩個記錄 (
AccountNumber
AW00012597
和AW00012596
) 由兩個不同的會話更新:
- 第 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
子句中指定的內容,因此存在阻塞,我猜這最終會消失。或者是鎖升級:沒有索引,它必須升級到表鎖,這就是阻塞。您確實需要查看塊/死鎖佔用的資源以了解發生了什麼*。*