Меня смущает фраза BOL:
"READUNCOMMITTED и NOLOCK нельзя указывать для таблиц, изменяемых операциями вставки, обновления или удаления. Оптимизатор запросов SQL Server игнорирует подсказки READUNCOMMITTED и NOLOCKв предложении FROM, которое применяется к целевой таблице оператора UPDATE или DELETE "[1]
Например, если я пишу
--script 1)
UPDATE Test SET Txt=(Select Txt from TEST WITH(NOLOCK) where ID=1)
WHERE ID=1
, он запускается без ошибок (или предупреждения) и, вероятно, эквивалентно
--script 2)
set transaction isolation level SERIALIZABLE;
begin tran
Declare @nvarm nvarchar(max);
Select @nvarm=Txt from Test where ID=1;
--Select @nvarm;
UPDATE Test SET Txt=@nvarm WHERE ID=1;
commit;
, который также запускается без ошибок или предупреждений.
Это эквивалентно?
Таблица та же самая, но в FROM она логически является исходной таблицей, а не целевой таблицей, которую я мог бы переписать 1) с другой исходной таблицей в качестве другой (физической) таблицы:
--script 3)
select *
into testDup
from TEST;
GO;
UPDATE Test SET Txt=(SELECT Txt FROM TestDUP WITH(NOLOCK) where ID=1)
WHERE ID=1
Почему NOLOCK следует игнорировать в другой таблице?
Или, если это не так, задать вопрос
Как записать UPDATE с подсказками "NOLOCK" в предложении FROM, которые применяются к целевой таблице UPDATE или DELETEутверждение "потому что даже в 1) и 2) физическая таблица одна и та же, но логически исходная (в SELECT) таблица и целевая (в UPDATE) таблица различны.
Как написать инструкцию UPDATE, демонстрирующую, что WITH (NOLOCK) игнорируется?
Почему его вообще следует игнорировать?Это игнорируется?
Или, если это неправильный вопрос, то
Почему синтаксис допускает подсказку, которая гарантированно игнорируется?
Еще раз: либо невозможно (или это так?) Написать такое утверждение, как написано в документации, или я не понимаю смысла "игнорировать" (Какой смысл игнорировать это?у вас это вообще есть?) ...
UPDATE2:
Ответы показывают, что NOLOCK НЕ (обновляется) игнорируется в предложении FROM инструкции UPDATE, что утверждается в документах BOL [1].
Ну, суть этого вопроса:
Можете ли вы привести какой-либо пример (контекст), в котором было бы целесообразно игнорировать NOLOCK в предложении FROM оператора UPDATE?
[1]
Таблица подсказок (Transact-SQL)
SQL Server 2008 R2
http://msdn.microsoft.com/en-us/library/ms187373.aspx