2011-07-19 5 views
3

私はので、何行が変更されていない更新プログラムの場合....行に影響を与えない場合は、ロックが作成されますか?

UPDATE table 
SET col = value 
WHERE X=Y 

そして、いや行の試合のようなSQL文を実行した場合、更新が作成したすべてのロックされていますか?

DBMSは、フィールドxがインデックス化されている場合は、あなたのUPDATE、レコードを一致させるためにそれをチェックしている間、そしておそらくそのインデックス上の共有ロックが存在します。Sybaseの+ SQL Serverの

答えて

0

です

あり任意の行ロックすることが、すべてのロック動作は、あなたがこのスクリプトで遊ぶ、時にはロックが何行が更新されていない場合でも取得し、保有していることを自分で見ることができますあなたのserver-level isolation settings.

0

上の偶発的であるべきではありません。

CREATE TABLE dbo.Test 
    (
     i INT NOT NULL 
      PRIMARY KEY , 
     j INT NULL 
    ) ; 
go 

INSERT dbo.Test 
     (i, j) 
VALUES (1, 2) ; 
GO 

SELECT @@spid ; 

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ; 

BEGIN TRANSACTION ; 

UPDATE dbo.Test 
SET  j = 3 
WHERE i = 3 ; 

SELECT * 
FROM sys.dm_tran_locks 
WHERE request_session_id = @@spid; 

COMMIT ; 
0

レコードに影響を及ぼさない更新ステートメントが使用されている場合、更新ステートメントで排他的なインテントロックが実行されている間に、トランザクションで最初に有効な行が選択されてからテーブルで更新されますただし、更新が必要な行がないため、このインテントロックはtakですテーブルを排他モードでトランザクションに追加します。

関連する問題