2011-03-30 90 views
1

我遇到了不明確的sql server 2008死鎖。Sql Sever 2008在同一索引上選擇並刪除死鎖

我有兩個表:

T1: ID – bigint (PK), JOBID – bigint, X- bigint 
T2: ID – bigint (PK), JOBID – bigint, X- bigint 

SQL Server錯誤日誌描述了以下內容:

Spid 233 is running this query: 
    SELECT TOP(500) FROM T1.X INNER JOIN T2 ON T1.X = T2.X WHERE T2.ID>-1 AND T2.ID<=10000 
Spid 234 is running this query: 
    DELETE FROM T2 WHERE (X=1) OR (X=7) OR (X=1233) OR X(=7878) OR (X=33) OR (X=776) OR (X=112) 
Spid 233 is waiting for a Shared KEY lock on index t2.PK_T2. (Spid 234 holds a conflicting X lock.) 
Spid 234 is waiting for an eXclusive KEY lock on index t2.PK_T2. (Spid 233 holds a conflicting S lock.) 

PK_X是關於標識列羣集升序索引(ID是自動遞增列) 。 T2還有另一個索引,它是JOBID和X上的非聚集索引。

兩個進程是同一個對象(T2.PK_T2)上鎖的擁有者嗎?

請幫幫忙, 多倫

回答

0

怎麼會這兩個過程是同一對象(T2.PK_T2)上的鎖的主人呢?

這些鎖不在整個索引上。它們是key鎖,並且將位於索引內的不同鍵(行)上。

2

在您的示例中,233正在嘗試拉出前500行。

234正試圖刪除相同範圍內的記錄。

234需要在它刪除行的獨家鎖,因此它鎖定了例如行200

233試圖讀取行200,並暫停等待234來完成其鎖定,並移動到另外300行。

234試圖刪除更多的行,233通過選擇它們來阻止它。

此時233阻塞了234,234也阻塞了233,所以這是一個死鎖。

這是一個行級鎖定問題。