1

不明な SQL Server 2008 デッドロックが発生しています。

私は2つのテーブルを持っています:

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 列 (自動インクリメント列である ID) のクラスター化された昇順インデックスです。T2 には、JOBID と X の非クラスター化インデックスである別のインデックスもあります。

両方のプロセスが同じオブジェクト (T2.PK_T2) のロックの所有者になっているのはなぜですか?

助けてください、ドロン

4

2 に答える 2

2

あなたの例では、233 は最初の 500 行を取得しようとしています。

234 が同じ範囲のレコードを削除しようとしています。

234 は、削除する行に排他ロックを必要とするため、たとえば行 200 をロックダウンします。

233 は行 200 を読み取ろうとして一時停止して 234 がロックを終了するのを待ち、他の 300 行に移動します。

234 はさらに行を削除しようとしますが、233 は行を選択してブロックしています。

この時点で 233 は 234 をブロックしており、234 も 233 をブロックしているため、デッドロックです。

行レベルのロックの問題です。

于 2011-03-30T13:23:06.423 に答える
0

両方のプロセスが同じオブジェクト (T2.PK_T2) のロックの所有者になっているのはなぜですか?

ロックはインデックス全体ではありません。それらはkeyロックであり、インデックス内の異なるキー (行) になります。

于 2011-03-30T10:10:42.753 に答える