Заблокируйте строку от чтений, пока SP выполняется

У меня есть много процессов.NET, читая сообщения из Таблицы базы данных SQL Server 2008 года и обрабатывая их по одному. Я реализую простой SP, чтобы 'заблокировать' строку, которая читается любым процессом, для предотвращения любых двух процессов, обрабатывающих ту же строку.

BEGIN TRAN

SELECT @status = status FROM t WHERE t.id = @id
IF @status = 'L'
BEGIN
    -- Already locked by another process. Skip this
    RETURN 0
END
ELSE
    UPDATE t SET status = 'L' WHERE id = @id
    RETURN 1
END

COMMIT

Однако это испорчено: иногда строка 'заблокирована' и обработала дважды. Я подозреваю, что существует проблема параллелизма: два процесса, читая состояние, прежде чем каждый обновляет его.

Я думаю, что это могло быть разрешено путем реализации блока чтения так или иначе (т.е. сделать ЧТЕНИЯ блока транзакции), но я не уверен, как сделать это. Кто-либо может помочь?

Большое спасибо заранее

Ryan

5
задан Ryan 29 July 2010 в 13:09
поделиться