Я столкнулся с проблемой взаимоблокировки synchronizing
таблицы несколько раз за короткий промежуток времени. Под синхронизацией я подразумеваю следующие действия:
- Вставьте данные для синхронизации во временную таблицу
- Обновить существующие записи в целевой таблице
- Вставить новые записи в целевую таблицу
- Удаление записей, которых нет в таблице синхронизации при определенных обстоятельствах
- Скиньте временную таблицу
Для операторов INSERT
и DELETE
я использую LEFT JOIN, похожий на:
INSERT INTO destination_table (fk1, fk2, val1)
FROM #tmp
LEFT JOIN destination_table dt ON dt.fk1 = #tmp.fk1
AND dt.fk2 = #temp.fk2
WHERE dt.pk IS NULL;
Граф взаимоблокировок сообщает, что первичный ключ таблицы назначения находится под монопольной блокировкой. Я предполагаю, что приведенный выше запрос вызывает блокировку таблицы или страницы вместо блокировки строки. Как бы я это подтвердил?
Я мог бы переписать приведенный выше запрос с помощью команды IN
, EXIST
или EXCEPT
. Есть ли дополнительные способы рефакторинга кода? Избежит ли рефакторинг с использованием любой из этих команд проблему взаимоблокировки? Какой из них будет лучшим? Я предполагаю EXCEPT
.