У меня проблема с тупиком в SQL Server, который я не смог решить.SQL deadlock on delete then bulk insert
В основном у меня есть большое количество параллельных подключений (от многих машин), выполняющих транзакции, где они сначала удаляют ряд записей, а затем повторно вставляют записи в том же диапазоне с объемной вставкой.
По существу, сделка выглядит следующим образом
BEGIN TRANSACTION T1
DELETE FROM [TableName] WITH(XLOCK HOLDLOCK) WHERE [Id][email protected] AND [SubId][email protected]
INSERT BULK [TableName] (
[Id] Int
, [SubId] Int
, [Text] VarChar(max) COLLATE SQL_Latin1_General_CP1_CI_AS
) WITH(CHECK_CONSTRAINTS, FIRE_TRIGGERS)
COMMIT TRANSACTION T1
Основная вставка только вставляет элементы, соответствующие Id и SubID делеции в той же транзакции. Кроме того, эти записи Id и SubId никогда не должны перекрываться.
Когда у меня достаточно параллельных транзакций этой формы, я начинаю видеть значительное количество взаимоблокировок между этими утверждениями.
Я добавил блокирующие подсказки XLOCK HOLDLOCK, чтобы попытаться решить проблему, но они, похоже, не помогают.
Каноническая тупиковый график этой ошибки показывает:
Подключение 1:
- Держит RangeX-X на PK_TableName
- ПРОВЕЛ замок IX страницу на столе
- запрашивающей X Page привязываться таблица
Соединение 2:
- Держит замок IX страницу на столе
- запросов RangeX-X блокировку таблицы
Что мне нужно сделать для того, чтобы гарантировать, что эти тупики не возникают.
Я делал некоторые чтения на замках RangeX-X, и я не уверен, что полностью понимаю, что происходит с ними. Есть ли у меня какие-либо возможности, кроме блокировки всей таблицы здесь?