У меня есть много процессов.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