私はBOLフレーズで混乱しています:UPDATEまたはDELETEステートメントのターゲットテーブルに適用されるFROM句でNOLOCKが無視されるのはなぜですか?
「READUNCOMMITTEDおよびNOLOCKを挿入、更新、または削除操作によって変更された表には指定できませんSQL Serverクエリオプティマイザは、FROM句にREADUNCOMMITTEDおよびNOLOCKヒントを無視します。それは例えば、「[1]
をUPDATEのターゲット表に適用するか、またはDELETEステートメント私は
--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 [email protected] WHERE ID=1;
commit;
とおそらく同等です。
これは同等ですか?
テーブルが同じであるが、それから、私は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を無視するのはなぜですか?
または、それが間違っている場合質問
物理テーブルが1)と2)であっても、「UPDATEまたはDELETEステートメントのターゲットテーブルに適用されるFROM句にNOLOCKヒントを持つ」UPDATEを書き込む方法同じですが論理的には、ソース(SELECT内)表とターゲット(UPDATE内)表は異なるものです。
WITH(NOLOCK)が無視されていることを示すUPDATE文を書く方法は?
何も無視する必要がありますか?それは無視されますか?
質問が間違っている場合は、
なぜ構文で無視されることが保証されているのですか?
もう一度、文書に書かれているような文章を書くことは不可能ですか(あるいはそれを無視しているのでしょうか? )...
UPDATE2:
答えは、BOL docs [1]によってアサートされているUPDATE文のFROM句でNOLOCKが無視(更新)されないことを示しています。
まあ、この質問の本質:
私は、UPDATE文のFROM句でNOLOCKの無視が意味をなさない例(文脈)を教えていただけますか?
UPDATEまたはDELETE文のFROM句[1]
テーブルヒント(Transact-SQL)
のSQL Server 2008 R2
http://msdn.microsoft.com/en-us/library/ms187373.aspx
「Table2 u WITH(NOLOCK)」のNOLOCKは無視されますか? –
@ vgv8 - 私は、NOLOCKヒントは、更新対象のテーブル以外のテーブル(したがって、ドキュメント内のターゲットテーブルへの参照)で尊重されると考えています。 –
エイア、これは常識的な希望ですが、事実は異なります。私の答えを見るhttp://stackoverflow.com/questions/4322368/why-nolock-is-ignored-in-the-from-clause-that-apply-to-the-target-table-of-an-up/4324639 #4324639 –