У меня есть 2 пакетные программы, 1 - программа, которая отправляет электронную почту, а другая - факс. Они оба обращаются к таблице с именем QUEUE
.
В программе отправителя электронной почты это происходит в отношении QUEUE
. Для каждой записи в QUEUE
, которая удовлетворяет критериям:
- Блокирует запись 1 в
QUEUE
таблице:
select 1 from QUEUE with (UPDLOCK) where id = 1
- Процесс отправки из электронной почты
- Удалить запись 1 в таблице QUEUE:
delete from QUEUE where id = 1
- фиксация транзакции (транзакция не выполняется автоматически)
В программе отправки факсов также выполняются аналогичные действия, за исключением того, что на шаге 2 мы отправляем факс (конечно).
Проблема в том, что иногда удаление из QUEUE
выдает исключение, что оно заблокировано. Тем самым происходит повторная отправка электронных писем / факсов. Я уверен, что группа записей, обработанная этими программами, не пересекается.
Кажется, что delete пытается получить блокировку Update (U) для других записей в таблице, хотя должна быть удалена только одна запись. Таким образом, исключение происходит, когда другие транзакции блокируют другие записи в этой же таблице.
При этом мне нужно знать, есть ли возможность заставить операцию «удалить» не получать блокировки на записи, отличные от той записи, которую она удалит. Потому что, похоже, проблема в том, что операция удаления удаляет блокировки других записей в таблице.
Кстати, вот некоторая информация о базе данных (я не уверен, что они помогут):
- Read Committed Snapshot включен
- Состояние изоляции моментального снимка включено