SELECT и UPDATE таблицы, чтобы не было перекрытия потоков
Скажем, у меня есть следующая таблица:
ID|Read
-------
1|true
2|false
3|false
4|false
... и мне нужно прочитать самый маленький идентификатор, который имеет [Read] == false; плюс, обновите, что я сейчас прочитал.
Поэтому, если я выполню хранимую процедуру dbo.getMinID, она вернет ID: 2 и обновит [Read] -> правда.
CREATE PROCEDURE [dbo].[getMinID]
(
@QueryID INT OUTPUT
)
BEGIN
SELECT TOP 1 @QueryID = [ID] from Table
UPDATE Table SET [Read] = 1 WHERE [ID] = @QueryID
END
Проблема в том, что у меня есть десять (10) асинхронных потоков, одновременно выполняющих dbo.getMinID, и я НЕ МОГУ заставить их выбрать ОДИН ЖЕ [ID] при любых обстоятельствах. Я обеспокоен тем, что второй поток может выполняться между моим оператором SELECT и UPDATE, возвращая, таким образом, [ID]: 2 в обоих сценариях.
Как я могу гарантировать, что я не выберу / не обновлю одну и ту же запись дважды, независимо от того, сколько потоков воздействует на хранимую процедуру? ТАКЖЕ, имейте в виду, что в таблицу ПОСТОЯННО добавлены новые строки, поэтому я не могу заблокировать таблицу!