SET TRANSACTION ISOLATION LEVEL (Transact-SQL)SET TRANSACTION ISOLATION LEVEL (Transact-SQL)

適用対象: ○SQL Server (2008 以降)○Azure SQL Database○Azure SQL Data Warehouse ○Parallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

ロックおよび行のバージョン管理動作を制御 Transact-SQLTransact-SQLへの接続によって実行されたステートメント SQL ServerSQL Serverです。Controls the locking and row versioning behavior of Transact-SQLTransact-SQL statements issued by a connection to SQL ServerSQL Server.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server and Azure SQL Database

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

引数Arguments

READ UNCOMMITTEDREAD UNCOMMITTED
他のトランザクションで変更されたが、まだコミットされていない行を、ステートメントで読み取れるように指定します。Specifies that statements can read rows that have been modified by other transactions but not yet committed.

READ UNCOMMITTED レベルで実行されるトランザクションでは共有ロックが取得されないため、現在のトランザクションで読み取り中のデータが他のトランザクションで変更されることがあります。Transactions running at the READ UNCOMMITTED level do not issue shared locks to prevent other transactions from modifying data read by the current transaction. また、READ UNCOMMITTED トランザクションは排他ロックによってブロックされないため、他のトランザクションで変更された後まだコミットされていない行を、現在のトランザクションで読み取ることができます。READ UNCOMMITTED transactions are also not blocked by exclusive locks that would prevent the current transaction from reading rows that have been modified but not committed by other transactions. このオプションが設定されている場合に、コミットされていない変更が読み取られた場合、これをダーティ リードと呼びます。When this option is set, it is possible to read uncommitted modifications, which are called dirty reads. この場合、トランザクションが終了していなくても、データの値を変更したり、データセットの行を挿入または削除することができます。Values in the data can be changed and rows can appear or disappear in the data set before the end of the transaction. このオプションは、トランザクション内のすべての SELECT ステートメントで、すべてのテーブルに対して NOLOCK を設定するのと同じ効果があります。This option has the same effect as setting NOLOCK on all tables in all SELECT statements in a transaction. これは分離レベルの中で最も制限の緩やかなオプションです。This is the least restrictive of the isolation levels.

SQL ServerSQL Server では、コミットされていないデータ変更のダーティ リードが行われないようトランザクションを保護しながら、ロックの競合を最小限にすることもできます。これには、次のいずれかを使用します。In SQL ServerSQL Server, you can also minimize locking contention while protecting transactions from dirty reads of uncommitted data modifications using either:

  • READ_COMMITTED_SNAPSHOT データベース オプションを使用して READ COMMITTED 分離レベルは、ON に設定します。The READ COMMITTED isolation level with the READ_COMMITTED_SNAPSHOT database option set to ON.

  • SNAPSHOT 分離レベル。The SNAPSHOT isolation level.

    READ COMMITTEDREAD COMMITTED
    他のトランザクションで変更されたが、まだコミットされていないデータを、ステートメントで読み取れないように指定します。Specifies that statements cannot read data that has been modified but not committed by other transactions. これにより、ダーティ リードを防ぐことができます。This prevents dirty reads. 現在のトランザクション内にある各ステートメント間では、他のトランザクションによるデータの変更が可能です。この結果、反復不能読み取りやファントム データが発生することがあります。Data can be changed by other transactions between individual statements within the current transaction, resulting in nonrepeatable reads or phantom data. このオプションは、 SQL ServerSQL Server既定値です。This option is the SQL ServerSQL Server default.

    READ COMMITTED の動作は、READ_COMMITTED_SNAPSHOT データベース オプションの設定によって異なります。The behavior of READ COMMITTED depends on the setting of the READ_COMMITTED_SNAPSHOT database option:

  • READ_COMMITTED_SNAPSHOT が OFF に設定されている場合 (既定)、 データベース エンジンDatabase Engineでは共有ロックが使用され、現在のトランザクションでの読み取り操作中に他のトランザクションによって行が変更されるのを防ぐことができます。If READ_COMMITTED_SNAPSHOT is set to OFF (the default), the データベース エンジンDatabase Engine uses shared locks to prevent other transactions from modifying rows while the current transaction is running a read operation. また、ステートメントが他のトランザクションで変更された行を読み取ろうとしても、そのトランザクションが完了するまでステートメントはブロックされます。The shared locks also block the statement from reading rows modified by other transactions until the other transaction is completed. いつ解放されるかは、共有ロックの種類によって決まります。The shared lock type determines when it will be released. 行ロックは、次の行が処理される前に解放されます。Row locks are released before the next row is processed. 次のページが読み取られ、ステートメントの終了時にテーブル ロックがリリースされたときに、ページ ロックが解放されます。Page locks are released when the next page is read, and table locks are released when the statement finishes.

    注意

    READ_COMMITTED_SNAPSHOT が ON に設定されている場合、 データベース エンジンDatabase Engineでは行のバージョン管理が使用され、各ステートメントでは、トランザクション全体で一貫性のあるデータのスナップショットが使用されます。このスナップショットは、ステートメント開始時点に存在したデータのスナップショットです。If READ_COMMITTED_SNAPSHOT is set to ON, the データベース エンジンDatabase Engine uses row versioning to present each statement with a transactionally consistent snapshot of the data as it existed at the start of the statement. ただし、他のトランザクションによるデータ更新を防ぐためのロックは使用されません。Locks are not used to protect the data from updates by other transactions.

    スナップショット分離は、FILESTREAM データをサポートします。Snapshot isolation supports FILESTREAM data. スナップショット分離モードでは、トランザクションの任意のステートメントによって読み取られる FILESTREAM データは、トランザクションの開始時に存在していたデータのバージョンとトランザクション的な一貫性があります。Under snapshot isolation mode, FILESTREAM data read by any statement in a transaction will be the transactionally consistent version of the data that existed at the start of the transaction.

    READ_COMMITTED_SNAPSHOT データベース オプションが ON の場合は、READ_COMMITTED 分離レベルで実行されるトランザクションの各ステートメントで行のバージョン管理を使用する代わりに、READCOMMITTEDLOCK テーブル ヒントを使用して共有ロックを要求することもできます。When the READ_COMMITTED_SNAPSHOT database option is ON, you can use the READCOMMITTEDLOCK table hint to request shared locking instead of row versioning for individual statements in transactions running at the READ COMMITTED isolation level.

注意

READ_COMMITTED_SNAPSHOT オプションを設定すると、そのデータベースでは ALTER DATABASE コマンドを実行する接続のみが許可されます。When you set the READ_COMMITTED_SNAPSHOT option, only the connection executing the ALTER DATABASE command is allowed in the database. ALTER DATABASE が完了するまで、そのデータベースには他に開かれた接続が存在しないようにする必要があります。There must be no other open connection in the database until ALTER DATABASE is complete. データベースをシングル ユーザー モードに設定する必要はありません。The database does not have to be in single-user mode.

REPEATABLE READREPEATABLE READ
他のトランザクションで変更されたが、コミットされていないデータをステートメントで読み取れないように指定すると共に、現在のトランザクションが完了するまでは現在のトランザクションで読み取ったデータを他のトランザクションで変更できないように指定します。Specifies that statements cannot read data that has been modified but not yet committed by other transactions and that no other transactions can modify data that has been read by the current transaction until the current transaction completes.

トランザクションの各ステートメントで読み取ったすべてのデータには共有ロックが設定され、トランザクションが完了するまでその状態が保持されます。Shared locks are placed on all data read by each statement in the transaction and are held until the transaction completes. これにより、現在のトランザクションで読み取った行は、他のトランザクションで変更できなくなります。This prevents other transactions from modifying any rows that have been read by the current transaction. 他のトランザクションでは、現在のトランザクションで実行されているステートメントの検索条件に一致する行を新しく挿入することができます。Other transactions can insert new rows that match the search conditions of statements issued by the current transaction. その後、現在のトランザクションでステートメントが再試行された場合は新しい行が取得されるので、この結果ファントム読み取りが発生します。If the current transaction then retries the statement it will retrieve the new rows, which results in phantom reads. 共有ロックはステートメントが完了するたびに解除されるのではなく、トランザクションが完了するまで保持されるため、同時実行性は既定の READ COMMITTED 分離レベルよりも低くなります。Because shared locks are held to the end of a transaction instead of being released at the end of each statement, concurrency is lower than the default READ COMMITTED isolation level. このオプションは、必要な場合にのみ使用してください。Use this option only when necessary.

SNAPSHOTSNAPSHOT
トランザクションの各ステートメントで、トランザクション全体で一貫性のあるデータを読み取るように指定します。このデータは、トランザクション開始時点に存在したデータです。Specifies that data read by any statement in a transaction will be the transactionally consistent version of the data that existed at the start of the transaction. データの変更は、トランザクションの開始前にコミットされたものだけが認識されます。The transaction can only recognize data modifications that were committed before the start of the transaction. 現在のトランザクションが開始されてから他のトランザクションによってデータが変更されても、現在のトランザクションで実行されるステートメントではデータの変更は認識されません。Data modifications made by other transactions after the start of the current transaction are not visible to statements executing in the current transaction. このオプションでは、トランザクションの各ステートメントにおいて、トランザクションの開始時点でコミットされていたデータのスナップショットを取得するのと同じ効果が得られます。The effect is as if the statements in a transaction get a snapshot of the committed data as it existed at the start of the transaction.

データベースが復旧中の場合を除いて、SNAPSHOT トランザクションではデータの読み取り時にロックが要求されません。Except when a database is being recovered, SNAPSHOT transactions do not request locks when reading data. SNAPSHOT トランザクションでデータが読み取られている間も、他のトランザクションによるデータの書き込みはブロックされません。SNAPSHOT transactions reading data do not block other transactions from writing data. トランザクションでデータが書き込まれている間も、SNAPSHOT トランザクションではデータを読み取ることができます。Transactions writing data do not block SNAPSHOT transactions from reading data.

データベースの復旧でロールバックが行われており、ロールバック中のトランザクションによってデータがロックされている場合に、そのデータの読み取りが試行されると、SNAPSHOT トランザクションではロックが要求されます。During the roll-back phase of a database recovery, SNAPSHOT transactions will request a lock if an attempt is made to read data that is locked by another transaction that is being rolled back. トランザクションのロールバックが完了するまで SNAPSHOT トランザクションはブロックされ、The SNAPSHOT transaction is blocked until that transaction has been rolled back. 許可が与えられるとすぐロックは解除されます。The lock is released immediately after it has been granted.

SNAPSHOT 分離レベルを使用するトランザクションを開始する前には、ALLOW_SNAPSHOT_ISOLATION データベース オプションを ON に設定する必要があります。The ALLOW_SNAPSHOT_ISOLATION database option must be set to ON before you can start a transaction that uses the SNAPSHOT isolation level. SNAPSHOT 分離レベルを使用するトランザクションで複数のデータベースのデータへアクセスする場合は、各データベースで ALLOW_SNAPSHOT_ISOLATION を ON に設定する必要があります。If a transaction using the SNAPSHOT isolation level accesses data in multiple databases, ALLOW_SNAPSHOT_ISOLATION must be set to ON in each database.

他の分離レベルで開始されたトランザクションに SNAPSHOT 分離レベルを設定することはできません。設定すると、トランザクションは中止されます。A transaction cannot be set to SNAPSHOT isolation level that started with another isolation level; doing so will cause the transaction to abort. トランザクションを SNAPSHOT 分離レベルで開始した場合は、他の分離レベルに変更することができ、その後 SNAPSHOT に戻すことができます。If a transaction starts in the SNAPSHOT isolation level, you can change it to another isolation level and then back to SNAPSHOT. トランザクションの開始は、初めてデータにアクセスした時点からになります。A transaction starts the first time it accesses data.

SNAPSHOT 分離レベルで実行されているトランザクションでは、そのトランザクションで行った変更が認識されます。A transaction running under SNAPSHOT isolation level can view changes made by that transaction. たとえば、トランザクションでテーブルの UPDATE を実行した後、同じテーブルに対して SELECT ステートメントを実行した場合、結果セットには変更後のデータが含まれます。For example, if the transaction performs an UPDATE on a table and then issues a SELECT statement against the same table, the modified data will be included in the result set.

注意

スナップショット分離モードでは、トランザクションの任意のステートメントによって読み取られる FILESTREAM データは、ステートメントの開始時ではなく、トランザクションの開始時に存在していたデータのバージョンとトランザクション的な一貫性があります。Under snapshot isolation mode, FILESTREAM data read by any statement in a transaction will be the transactionally consistent version of the data that existed at the start of the transaction, not at the start of the statement.

SERIALIZABLESERIALIZABLE
次のことを指定します。Specifies the following:

  • 他のトランザクションで変更されたが、まだコミットされていないデータは、ステートメントで読み取れない。Statements cannot read data that has been modified but not yet committed by other transactions.

  • 現在のトランザクションが完了するまで、現在のトランザクションで読み取ったデータは他のトランザクションで変更できない。No other transactions can modify data that has been read by the current transaction until the current transaction completes.

  • 現在のトランザクションが完了するまで、現在のトランザクションのステートメントで読み取ったキー範囲に該当するキー値の行は、他のトランザクションで新しく挿入できない。Other transactions cannot insert new rows with key values that would fall in the range of keys read by any statements in the current transaction until the current transaction completes.

    トランザクションで実行される各ステートメントの検索条件に一致するキー値の範囲には、範囲ロックが設定されます。Range locks are placed in the range of key values that match the search conditions of each statement executed in a transaction. これにより、現在のトランザクションで実行されるステートメントの処理対象となる行はブロックされ、他のトランザクションによる行の更新や挿入ができなくなります。This blocks other transactions from updating or inserting any rows that would qualify for any of the statements executed by the current transaction. つまり、トランザクションのステートメントが 2 度実行された場合は、2 度目も同じ行セットが読み取られます。This means that if any of the statements in a transaction are executed a second time, they will read the same set of rows. 範囲ロックはトランザクションが完了するまで保持されます。The range locks are held until the transaction completes. このオプションではキー範囲全体がロックされ、トランザクションが完了するまでその状態が保持されるので、これは最も制限の厳しい分離レベルといえます。This is the most restrictive of the isolation levels because it locks entire ranges of keys and holds the locks until the transaction completes. このオプションは同時実行性が低いため、必要なときにのみ使用してください。Because concurrency is lower, use this option only when necessary. このオプションは、トランザクション内のすべての SELECT ステートメントで、すべてのテーブルに対して HOLDLOCK を設定するのと同じ効果があります。This option has the same effect as setting HOLDLOCK on all tables in all SELECT statements in a transaction.

解説Remarks

分離レベル オプションは一度に 1 つだけ設定でき、設定したオプションは明示的に変更されない限り、その接続で継続的に使用されます。Only one of the isolation level options can be set at a time, and it remains set for that connection until it is explicitly changed. ステートメントの FROM 句内にあるテーブル ヒントで、テーブルに対して別のロック動作やバージョン管理動作が指定されない限り、トランザクションのすべての読み取り操作は、指定した分離レベルのルールに従って実行されます。All read operations performed within the transaction operate under the rules for the specified isolation level unless a table hint in the FROM clause of a statement specifies different locking or versioning behavior for a table.

トランザクションの分離レベルでは、読み取り操作に対して取得されるロックの種類が定義されます。The transaction isolation levels define the type of locks acquired on read operations. READ COMMITTED または REPEATABLE READ で取得される共有ロックは通常、行ロックです。読み取り操作でページまたはテーブルの行が大量に参照される場合は、ページ ロックまたはテーブル ロックに変更される場合があります。Shared locks acquired for READ COMMITTED or REPEATABLE READ are generally row locks, although the row locks can be escalated to page or table locks if a significant number of the rows in a page or table are referenced by the read. トランザクションで行の読み取り後に変更が行われる場合、そのトランザクションでは排他ロックによって行が保護され、トランザクションが完了するまでその状態が保持されます。If a row is modified by the transaction after it has been read, the transaction acquires an exclusive lock to protect that row, and the exclusive lock is retained until the transaction completes. たとえば REPEATABLE READ トランザクションで、行に対する共有ロックが取得され、その行が変更される場合、共有行ロックは排他行ロックに変わります。For example, if a REPEATABLE READ transaction has a shared lock on a row, and the transaction then modifies the row, the shared row lock is converted to an exclusive row lock.

分離レベルはトランザクションの実行中いつでも変更できます。ただし、With one exception, you can switch from one isolation level to another at any time during a transaction. どの分離レベルでも、SNAPSHOT 分離レベルに変更した場合は例外が発生します。The exception occurs when changing from any isolation level to SNAPSHOT isolation. このときトランザクションは失敗し、ロールバックされます。Doing this causes the transaction to fail and roll back. SNAPSHOT 分離で開始したトランザクションを他の任意の分離レベルに変更することはできます。However, you can change a transaction started in SNAPSHOT isolation to any other isolation level.

トランザクションの分離レベルを変更した場合、変更後に読み取られるリソースは、新しいレベルのルールに従って保護されます。When you change a transaction from one isolation level to another, resources that are read after the change are protected according to the rules of the new level. 変更前に読み取られたリソースは、引き続き以前のレベルのルールに従って保護されます。Resources that are read before the change continue to be protected according to the rules of the previous level. たとえば、トランザクションが READ COMMITTED から SERIALIZABLE に変更された場合、変更後に取得される共有ロックは、トランザクションの終了まで保持されるようになります。For example, if a transaction changed from READ COMMITTED to SERIALIZABLE, the shared locks acquired after the change are now held until the end of the transaction.

SET TRANSACTION ISOLATION LEVEL をストアド プロシージャまたはトリガーで実行した場合は、オブジェクトから制御が返されると、分離レベルはオブジェクトの呼び出し時に使用されていたレベルに再設定されます。If you issue SET TRANSACTION ISOLATION LEVEL in a stored procedure or trigger, when the object returns control the isolation level is reset to the level in effect when the object was invoked. たとえば、バッチで REPEATABLE READ を設定し、このバッチからストアド プロシージャを呼び出して分離レベルを SERIALIZABLE に設定した場合、ストアド プロシージャからバッチに制御が返されると、分離レベルの設定は REPEATABLE READ に戻ります。For example, if you set REPEATABLE READ in a batch, and the batch then calls a stored procedure that sets the isolation level to SERIALIZABLE, the isolation level setting reverts to REPEATABLE READ when the stored procedure returns control to the batch.

注意

ユーザー定義関数と共通言語ランタイム (CLR) ユーザー定義型では、SET TRANSACTION ISOLATION LEVEL は実行できません。User-defined functions and common language runtime (CLR) user-defined types cannot execute SET TRANSACTION ISOLATION LEVEL. ただし、テーブル ヒントを使用して分離レベルを指定することはできます。However, you can override the isolation level by using a table hint. 詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。For more information, see Table Hints (Transact-SQL).

sp_bindsession を使用して 2 つのセッションをバインドすると、各セッションではそれぞれの分離レベル設定が保持されます。When you use sp_bindsession to bind two sessions, each session retains its isolation level setting. SET TRANSACTION ISOLATION LEVEL を使用してセッションの分離レベル設定を変更しても、そのセッションにバインドしている他のセッションの設定に影響はありません。Using SET TRANSACTION ISOLATION LEVEL to change the isolation level setting of one session does not affect the setting of any other sessions bound to it.

SET TRANSACTION ISOLATION LEVEL は、解析時ではなく実行時に有効なレベルです。SET TRANSACTION ISOLATION LEVEL takes effect at execute or run time, and not at parse time.

ヒープに対して最適化された一括読み込み操作を行うと、次の分離レベルで実行されるクエリがブロックされます。Optimized bulk load operations on heaps block queries that are running under the following isolation levels:

  • SNAPSHOTSNAPSHOT

  • READ UNCOMMITTEDREAD UNCOMMITTED

  • READ COMMITTED (行のバージョン管理を使用する場合)READ COMMITTED using row versioning

    一方、これらの分離レベルでクエリを実行すると、ヒープに対する最適化された一括読み込み操作がブロックされます。Conversely, queries that run under these isolation levels block optimized bulk load operations on heaps. 一括読み込み操作の詳細については、次を参照してください。一括インポートし、データ ファイルのエクスポート (です。SQL Server ).For more information about bulk load operations, see Bulk Import and Export of Data (SQL Server).

    FILESTREAM が有効なデータベースでは、次のトランザクション分離レベルがサポートされています。FILESTREAM-enabled databases support the following transaction isolation levels.

分離レベルIsolation level Transact SQL アクセスTransact SQL access ファイル システム アクセスFile system access
READ UNCOMMITTEDRead uncommitted SQL Server 2017SQL Server 2017 サポートされていないUnsupported
読み取りのコミットRead committed SQL Server 2017SQL Server 2017 SQL Server 2017SQL Server 2017
REPEATABLE READRepeatable read SQL Server 2017SQL Server 2017 サポートされていないUnsupported
SerializableSerializable SQL Server 2017SQL Server 2017 サポートされていないUnsupported
READ COMMITTED SNAPSHOPRead committed snapshot SQL Server 2017SQL Server 2017 SQL Server 2017SQL Server 2017
スナップショットSnapshot SQL Server 2017SQL Server 2017 SQL Server 2017SQL Server 2017

使用例Examples

次の例のセット、TRANSACTION ISOLATION LEVELセッションのです。The following example sets the TRANSACTION ISOLATION LEVEL for the session. 後続の各 Transact-SQLTransact-SQL ステートメントに対して、 SQL ServerSQL Server ではトランザクションが完了するまですべての共有ロックが保持されます。For each Transact-SQLTransact-SQL statement that follows, SQL ServerSQL Server holds all of the shared locks until the end of the transaction.

USE AdventureWorks2012;  
GO  
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;  
GO  
BEGIN TRANSACTION;  
GO  
SELECT *   
    FROM HumanResources.EmployeePayHistory;  
GO  
SELECT *   
    FROM HumanResources.Department;  
GO  
COMMIT TRANSACTION;  
GO  

参照See Also

ALTER DATABASE (Transact-SQL) ALTER DATABASE (Transact-SQL)
DBCC USEROPTIONS (です。TRANSACT-SQL と #41 です。 DBCC USEROPTIONS (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
SET ステートメント (Transact-SQL) SET Statements (Transact-SQL)
テーブル ヒント (Transact-SQL)Table Hints (Transact-SQL)