2011-03-30 48 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,所以这是一个死锁。

这是一个行级锁定问题。