【问题标题】:Sql Sever 2008 Select and Delete deadlock on the same indexSql Server 2008 选择和删除同一索引上的死锁
【发布时间】:2011-03-30 21:23:06
【问题描述】:

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

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

请帮忙, 多伦

【问题讨论】:

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


    【解决方案1】:

    在您的示例中,233 正在尝试提取前 500 行。

    234 正在尝试删除同一范围内的记录。

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

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

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

    此时233阻塞了234,234也阻塞了233,所以是死锁。

    这是一个行级锁定问题。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 1970-01-01
        相关资源
        最近更新 更多