サーチ…


構文

  • トランザクション分離レベルを設定する{READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ |スナップショット|シリアル化可能} [; ]

備考

MSDNリファレンス: SET TRANSACTION ISOLATION LEVEL

コミットされていない読み取り

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

これは、ロックをまったく引き起こさないという点で、最も許容性の高い分離レベルです。文でトランザクションに書き込まれているがまだコミットされていない(つまりトランザクション中の)行を含むすべての行を読み取ることができることを指定します。この分離レベルは、「ダーティリード」の対象になる可能性があります。

コミットを読む

SQL Server 2008 R2
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

反復可能な読み取り

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

このトランザクション分離レベルは、 READ COMMITTEDよりもわずかに許容されます。共有ロックは、トランザクションの各文で読み取られたすべてのデータに配置され、各文の後に解放されるのではなく、トランザクションが完了するまで保持されます。

注:このオプションは、 READ COMMITTEDよりデッドロックだけでなく、データベースのパフォーマンス低下を引き起こす可能性が高いため、必要な場合にのみ使用してください。

スナップショット

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

トランザクションの任意のステートメントによって読み取られるデータが、トランザクションの開始時に存在していたトランザクションの一貫性のあるバージョンのデータであることを指定します。つまり、トランザクションの開始前にコミットされたデータのみを読み取ります。

SNAPSHOTトランザクションは、トランザクションが開始された時点で存在していたデータのバージョン(またはスナップショット)のみを読み込んでいるため、読み取られているデータのロックを要求またはロックしません。

SNAPSHOT分離レベルで実行されているトランザクションは、実行中に独自のデータ変更のみを読み取ります。たとえば、トランザクションは一部の行を更新してから更新された行を読み取ることができますが、その変更はコミットされるまで現在のトランザクションでのみ表示されます。


注: SNAPSHOT分離レベルを使用するには、 ALLOW_SNAPSHOT_ISOLATIONデータベース・オプションをONに設定する必要があります。

シリアライザブル

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE

この隔離レベルは最も制限的です。トランザクション内の各ステートメントによって読み取られるキー値の範囲を範囲ロックで要求します 。これは、挿入される行が現在のトランザクションによってロックされた範囲にある場合、他のトランザクションからのINSERT文がブロックされることを意味します。

このオプションは、トランザクション内のすべてのSELECTステートメントのすべてのテーブルでHOLDLOCKを設定するのと同じ効果があります。


注:このトランザクション分離は最も低い並行性を持ち、必要なときにのみ使用してください。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow