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 в обоих сценариях.

Как я могу гарантировать, что я не выберу / не обновлю одну и ту же запись дважды, независимо от того, сколько потоков воздействует на хранимую процедуру? ТАКЖЕ, имейте в виду, что в таблицу ПОСТОЯННО добавлены новые строки, поэтому я не могу заблокировать таблицу!

Ответы на вопрос(4)

Ваш ответ на вопрос