Sql Server 2008在同一索引上选择并删除死锁

时间:2011-03-30 10:08:13

标签: sql-server sql-server-2008 database-deadlocks

我遇到了一个不清楚的sql server 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是标识列上的Clustered升序索引(ID是自动增量列)。 T2还有另一个索引,它是JOBID和X上的非聚集索引。

为什么两个进程都是同一对象锁定的所有者(T2.PK_T2)?

请帮忙, 多伦

2 个答案:

答案 0 :(得分:2)

在你的例子中,233试图拉出前500行。

234正试图删除相同范围内的记录。

234需要对其删除的行进行独占锁定,因此它会锁定,例如第200行。

233正在尝试读取第200行并暂停以等待234完成其锁定,并继续移动到其他300行。

234尝试删除更多行,233阻止它选择它们。

此时233阻塞234,234阻塞233,所以这是一个死锁。

这是一个行级锁定问题。

答案 1 :(得分:0)

为什么两个进程都是同一对象锁定的所有者(T2.PK_T2)?

锁定不在整个索引上。它们是key锁,并且将位于索引中的不同键(行)上。