一直在閱讀有關死鎖的很多內容,並且當我認爲自己很清楚時,問題就來了。在更新單個表格上的兩個不同行時發生死鎖
有兩個類似的交易在同一時間進行。它們看起來象下面這樣:
BEGIN TRAN //read_committed_snapshot ON
//an application sends insert query
INSERT INTO t1 VALUES('Name',15)
//later on application sends update query for the newly inserted row
UPDATE t1 SET name='NewName', number=16 WHERE id = 10 //this ID is the id of the inserted row.
COMMIT
給定的代碼是不準確的一個,我在我的應用程序中使用,但這個想法是一樣的,它只是有更多的列。
表t1具有主鍵ID和一些非聚簇索引。
在同時運行這兩個事務之後,它會發生死鎖。分析器說,對於每個衝突進程,死鎖查詢是這個UPDATE t1 SET name='NewName', number=16 WHERE id = :id
。
對不起,我沒有死鎖的XML,但探查器告訴兩個進程有X鎖,他們都試圖獲得U鎖。
process 1
owner - X
waiter - U
process 2
owner - X
waiter - U
t1
表中示出了用於兩個過程作爲對象和PK_id指數爲indexname
。
那麼這裏究竟發生了什麼?每個事務更新同一個表中的不同行,它爲什麼會死鎖?
在網絡上的許多例子說:「嘿,因爲它是如何掃描索引它,它掃描一個事務和其他事務其他一些非聚集索引PK指數」,但他們的探查僵局圖indexname
下表現出不同的值,所以這是不一樣,我的索引名稱是相同的。
任何想法如何解決這個問題?這讓我瘋狂。我認爲啓用read_committed_snapshot會解決這個問題,但我錯了。
但它已經獲得排他鎖,我會理解的是正在更新的行的鍵鎖。試圖將更新鎖定在除了所討論的兩行以外的其他任何東西上的意義何在。我會檢查執行計劃,當我能夠(我很容易仍然迷失在那裏) – user1651105 2012-01-17 19:41:16
表格和頁面上會有意圖鎖定,並且由於表格有索引 - 查詢可能會干擾更新索引以及 – 2012-01-18 03:51:39