Если вы не хотите, чтобы кто-либо обновлял / удалял строку, я бы добавил UPDLOCK в оператор SELECT. Это указывает на то, что вы скоро обновите ту же строку, например
select @Bar = Bar from oFoo WITH (UPDLOCK) where Foo = @Foo;
Теперь, если вы хотите, чтобы никто не мог прочитать значение, я бы использовал ROWLOCK (+ HOLDLOCK XLOCK, чтобы сделать его эксклюзивным и удерживать до конца транзакции).
Вы можете сделать TABLOCK (X), но это заблокирует всю таблицу для монопольного доступа этой одной транзакцией. Даже если кто-то придет и захочет выполнить вашу процедуру в другой строке (например, с другим значением @Foo), он будет заблокирован до завершения предыдущей транзакции.
Примечание : вы можете смоделировать различные сценарии с помощью этого сценария:
CREATE TABLE ##temp (a int, b int)
INSERT INTO ##temp VALUES (0, 0)
клиент № 1
BEGIN TRAN
SELECT * FROM ##temp WITH (HOLDLOCK XLOCK ROWLOCK) WHERE a = 0
waitfor delay '0:00:05'
update ##temp set a = 1 where a = 0
select * from ##temp
commit tran
клиент № 2:
begin tran
select * from ##temp where a = 0 or a = 1
commit tran