Microsoft SQL Server
トランザクション分離レベル
サーチ…
構文
- トランザクション分離レベルを設定する{READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ |スナップショット|シリアル化可能} [; ]
備考
MSDNリファレンス: SET TRANSACTION ISOLATION LEVEL
コミットされていない読み取り
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
これは、ロックをまったく引き起こさないという点で、最も許容性の高い分離レベルです。文でトランザクションに書き込まれているがまだコミットされていない(つまりトランザクション中の)行を含むすべての行を読み取ることができることを指定します。この分離レベルは、「ダーティリード」の対象になる可能性があります。
コミットを読む
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
この隔離レベルは、2番目に許容されるレベルです。汚れた読み込みを防止します。 READ COMMITTED
の動作は、 READ_COMMITTED_SNAPSHOT
設定によって異なります。
オフ(デフォルト設定)に設定すると、トランザクションは共有ロックを使用して、他のトランザクションが現在のトランザクションで使用されている行を変更できないようにします。
ONに設定すると、
READ COMMITTED
モードで実行中のトランザクションの行バージョニングではなく、共有ロックを要求するためにREADCOMMITTEDLOCK
テーブルヒントを使用できます。
注: READ COMMITTED
は、デフォルトのSQL Serverの動作です。
「ダーティー・リード」とは何ですか?
ダーティー・リード(またはコミットされていないリード)は、オープン・トランザクションによって変更されている行の読み取りです。
この動作は、2つの個別のクエリを使用してレプリケートできます.1つはトランザクションを開き、コミットせずにテーブルにデータを書き込み、もう1つはこの分離レベルで書き込むデータを選択することです。
クエリ1 - トランザクションを準備するが完了しない:
CREATE TABLE dbo.demo (
col1 INT,
col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here
クエリ2 - 開いているトランザクションを含む行を読み込みます。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;
戻り値:
col1 col2 ----------- --------------------------------------- 99 Normal transaction 42 Dirty read
PS:このデモのデータを整理することを忘れないでください:
COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO
反復可能な読み取り
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
このトランザクション分離レベルは、 READ COMMITTED
よりもわずかに許容されます。共有ロックは、トランザクションの各文で読み取られたすべてのデータに配置され、各文の後に解放されるのではなく、トランザクションが完了するまで保持されます。
注:このオプションは、 READ COMMITTED
よりデッドロックだけでなく、データベースのパフォーマンス低下を引き起こす可能性が高いため、必要な場合にのみ使用してください。
スナップショット
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
トランザクションの任意のステートメントによって読み取られるデータが、トランザクションの開始時に存在していたトランザクションの一貫性のあるバージョンのデータであることを指定します。つまり、トランザクションの開始前にコミットされたデータのみを読み取ります。
SNAPSHOT
トランザクションは、トランザクションが開始された時点で存在していたデータのバージョン(またはスナップショット)のみを読み込んでいるため、読み取られているデータのロックを要求またはロックしません。
SNAPSHOT
分離レベルで実行されているトランザクションは、実行中に独自のデータ変更のみを読み取ります。たとえば、トランザクションは一部の行を更新してから更新された行を読み取ることができますが、その変更はコミットされるまで現在のトランザクションでのみ表示されます。
注: SNAPSHOT
分離レベルを使用するには、 ALLOW_SNAPSHOT_ISOLATION
データベース・オプションをONに設定する必要があります。
シリアライザブル
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE
この隔離レベルは最も制限的です。トランザクション内の各ステートメントによって読み取られるキー値の範囲を範囲ロックで要求します 。これは、挿入される行が現在のトランザクションによってロックされた範囲にある場合、他のトランザクションからのINSERT
文がブロックされることを意味します。
このオプションは、トランザクション内のすべてのSELECT
ステートメントのすべてのテーブルでHOLDLOCK
を設定するのと同じ効果があります。
注:このトランザクション分離は最も低い並行性を持ち、必要なときにのみ使用してください。