Добавление ROWLOCK,UPDLOCK
к подзапросу должно сделать это.
ALTER PROCEDURE Blah
AS
DECLARE @targetval INT
UPDATE table1
SET field9 = 1,
@targetval = field1
WHERE field1 = (SELECT TOP 1 field1
FROM table1 t WITH (rowlock, updlock)
WHERE ( t.field2 = 'this' )
AND ( t.field3 = 'that' )
AND ( t.field4 = 'yep' )
AND ( t.field9 <> 1 ))
RETURN
Обновлено
В настоящее время принятый ответ на этот вопрос не использует updlock
. Я совсем не уверен, что это будет работать. Насколько я вижу из тестирования в запросе этого типа с подзапросом, SQL Server будет принимать только S
блокировок для подзапроса. Однако иногда подзапрос будет оптимизирован, поэтому этот подход может работать так же, как и в Query 2.
Тестовый скрипт - Настройка
CREATE TABLE test_table
(
id int identity(1,1) primary key,
col char(40)
)
INSERT INTO test_table
SELECT NEWID() FROM sys.objects
Запрос 1
update test_table
set col=NEWID()
where id=(SELECT top (1) id from test_table )
Запрос 2
update test_table
set col=NEWID()
where id=(SELECT max(id) from test_table)