Скажите, у меня есть следующая таблица:
ID|Read
-------
1|true
2|false
3|false
4|false
... и мне нужно прочитать наименьший идентификатор, который имеет [Read] == false; плюс, обновите, что я сейчас прочитал.
Так что, если я выполню свою хранимую процедуру dbo.getMinID, он вернет ID: 2 и обновит [Read] -> true.
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 в обоих сценариях.
Как я могу убедиться, что я не выбираю / не обновляю одну и ту же запись дважды, независимо от того, сколько потоков воздействует на хранимую процедуру? ТАКЖЕ, имейте ввиду, что в таблицу ПОСТОЯННО добавлены новые строки, поэтому я не могу заблокировать таблицу!