Странное поведение блокировки в SQL Server 2005 - PullRequest
0 голосов
/ 20 июня 2011

Может ли кто-нибудь сказать мне, почему следующий оператор внутри данной хранимой процедуры возвращает повторяющиеся результаты даже при блокировках строк, используемых первым оператором SELECT?

BEGIN TRANSACTION

DECLARE @Temp TABLE ( ID INT )

INSERT INTO @Temp SELECT ID FROM SomeTable WITH (ROWLOCK, UPDLOCK, READPAST) WHERE SomeValue <= 10
INSERT INTO @Temp SELECT ID FROM SomeTable WITH (ROWLOCK, UPDLOCK, READPAST) WHERE SomeValue >= 5

SELECT * FROM @Temp

COMMIT TRANSACTION

Любые значения в SomeTable, для которых SomeValue находится в диапазоне от 5 до 10, будут возвращены дважды, даже если они были заблокированы в первом SELECT. Я думал, что для всей транзакции были установлены блокировки, и поэтому я не ожидал, что запрос выдаст повторные результаты. Почему это происходит?

1 Ответ

1 голос
/ 20 июня 2011

В том же сеансе / транзакции READPAST не будет иметь никакого эффекта.

Таким образом, даже если у вас есть ROWLOCK и UPDLOCK для первого SELECT, следующий SELECT игнорирует их. Если бы 2-й SELECT был другим сеансом, он бы работал как ожидалось.

См. Их для получения дополнительной информации: ЗАКАЗАТЬ ПО И С (ROWLOCK, UPDLOCK, READPAST) и TABLOCKX против SERIALIZABLE

...