Sql Sever 2008 Выберите и удалите взаимоблокировку по одному индексу - PullRequest
1 голос
/ 30 марта 2011

У меня непонятная тупик SQL Server 2008.

У меня есть две таблицы:

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

Журнал ошибок сервера sql описывает следующее:

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 - это кластеризованный восходящий индекс в столбце идентификаторов (идентификатор, который является столбцом автоматического увеличения).T2 также имеет другой индекс, который является некластеризованным индексом для JOBID и X.

Почему оба процесса являются владельцами блокировки для одного и того же объекта (T2.PK_T2)?

Пожалуйста, помогите,Дорон

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

В вашем примере 233 пытается получить первые 500 строк.

234 пытается удалить записи в том же диапазоне.

234 требуется эксклюзив заблокируйте строки, которые он удаляет, поэтому он блокирует, например, строку 200.

233 пытается прочитать строку 200 и делает паузу, ожидая, пока 234 завершит блокировку, и переходит к другим 300 строкам.

234 пытается удалить больше строк, и 233 блокирует их, выбирая их.

В этот момент 233 блокирует 234, а 234 также блокирует 233, поэтому это тупик.

Это проблема блокировки на уровне строк.

0 голосов
/ 30 марта 2011

Почему оба процесса являются владельцами блокировки для одного и того же объекта (T2.PK_T2)?

Блокировки не для всего индекса.Это key блокировки и они будут на разных ключах (строках) в индексе.

...