Вы пробовали использовать:
SELECT @status = status FROM t (UPDLOCK) WHERE t.id = @id
Для получения более подробной информации см. эту ссылку.
Что вам не хватает, так это то, что оператор SELECT
обычно не блокирует строку, поэтому, если один процесс выполнил SELECT
, но еще не выполнил UPDATE
, но затем приходит другой процесс и выполняет SELECT, затем он возвращает строку назад, поскольку вы ее не заблокировали.
Используя UPDLOCK
, вы блокируете эту строку с помощью оператора SELECT и не позволяете другому процессу получить его обратно до тех пор, пока первый процесс не завершит транзакцию, как вам нужно.
EDIT
Конечно, сделать это одним утверждением, как предлагает Мартин, - самый простой способ, и вам вообще не придется сталкиваться с проблемой блокировки.