Я пытаюсь убедиться, что одна и только одна строка вставлена в таблицу, но я столкнулся с проблемами, когда несколько процессов сталкиваются друг с другом, и я получаю несколько строк. Вот подробности (возможно, более подробная информация, чем требуется, извините):Блокировка таблицы SQL для параллелизма
Существует таблица под названием «Области», которая содержит иерархию «областей». Каждая «область» может иметь ожидающие «заказы» в таблице «Заказы». Поскольку это иерархия, несколько «областей» могут быть сгруппированы под родительской «областью».
У меня есть хранимая процедура под названием FindNextOrder, которая, учитывая область, находит следующий отложенный ордер (который может быть в дочерней области) и «активирует» его. «Активация» означает вставку идентификатора OrderID в таблицу QueueActive. Бизнес-правило состоит в том, что область может иметь только один активный порядок за раз.
Так моя хранимая процедура имеет такое заявление:
IF EXISTS (SELECT 1 FROM QueueActive WHERE <Order exists for the given area>) RETURN
...
INSERT INTO QueueActive <Order data for the given area>
Моя проблема заключается в том, что каждый раз в то время, два различных процесса будет вызывать эту хранимую процедуру почти в то же время. Когда каждый проверяет существующую строку, каждый возвращается с нулем. Из-за этого оба процесса выполняют инструкцию insert, и я получаю TWO активных заказов вместо одного.
Как предотвратить это? О, и я использую SQL Server 2012 Express, но мне нужно решение, которое также работает в SQL Server 2000, 2005 и 2008 годах.
Я уже делал поиск только для блокировки стола и нашел this answer, но моя попытка выполнить это не удалась.
«Как я могу предотвратить это?»: Первое, что я хотел бы сделать, это добавить уникальный индекс. –