トランザクション分離レベルTransaction Isolation Levels

メモリ最適化テーブルにアクセスするトランザクションでは、次の分離レベルはサポートされます。The following isolation levels are supported for transactions that access memory-optimized tables.

  • SNAPSHOTSNAPSHOT

  • REPEATABLE READREPEATABLE READ

  • SERIALIZABLESERIALIZABLE

  • READ COMMITTEDREAD COMMITTED

    トランザクション分離レベルは、ネイティブ コンパイル ストアド プロシージャの ATOMIC ブロックの一部として指定できます。The transaction isolation level can be specified as part of the atomic block of a natively compiled stored procedure. 詳細については、「CREATE PROCEDURE (Transact-SQL)」を参照してください。For more information, see CREATE PROCEDURE (Transact-SQL). 解釈された Transact-SQLTransact-SQL からメモリ最適化テーブルにアクセスするときに、テーブル レベルのヒントを使用して分離レベルを指定することもできます。When accessing memory-optimized tables from interpreted Transact-SQLTransact-SQL, the isolation level can be specified using table-level hints.

    ネイティブ コンパイル ストアド プロシージャを定義する際には、トランザクション分離レベルを指定する必要があります。You must specify the transaction isolation level when you define a natively compiled stored procedure. 解釈された Transact-SQLTransact-SQL のユーザー トランザクションからメモリ最適化テーブルにアクセスするときは、テーブル ヒントで分離レベルを指定する必要があります。You must specify the isolation level in table hints when accessing memory-optimized tables from user transactions in interpreted Transact-SQLTransact-SQL. 詳細については、次を参照してください。メモリ最適化テーブルでのトランザクション分離レベルに関するガイドラインします。For more information, see Guidelines for Transaction Isolation Levels with Memory-Optimized Tables.

    自動コミット トランザクションを使用するメモリ最適化テーブルでは、READ COMMITTED 分離レベルがサポートされます。The isolation level READ COMMITTED is supported for memory-optimized tables with autocommit transactions. READ COMMITTED は、ユーザー トランザクションまたは ATOMIC ブロックでは無効です。READ COMMITTED is not valid in user transactions or in an atomic block. READ COMMITTED は、明示的または暗黙的なユーザー トランザクションではサポートされません。READ COMMITTED is not supported with explicit or implicit user transactions. 自動コミット トランザクションを使用するメモリ最適化テーブルについては、クエリがどのディスク ベース テーブルにもアクセスできない場合にのみ、分離レベル READ_COMMITTED_SNAPSHOT がサポートされます。Isolation level READ_COMMITTED_SNAPSHOT is supported for memory-optimized tables with autocommit transactions and only if the query does not access any disk-based tables. また、解釈された Transact-SQLTransact-SQL を使用して SNAPSHOT 分離で開始されるトランザクションでは、メモリ最適化テーブルにアクセスできません。In addition, transactions that are started using interpreted Transact-SQLTransact-SQL with SNAPSHOT isolation cannot access memory-optimized tables. REPEATABLE READ 分離または SERIALIZABLE 分離が指定された、解釈された Transact-SQLTransact-SQL を使用するトランザクションでは、SNAPSHOT 分離を使用してメモリ最適化テーブルにアクセスする必要があります。Transactions that are use interpreted Transact-SQLTransact-SQL with either REPEATABLE READ or SERIALIZABLE isolation must access memory-optimized tables using SNAPSHOT isolation. このシナリオの詳細については、次を参照してください。コンテナーにまたがるトランザクションです。For more information about this scenario, see Cross-Container Transactions.

    READ COMMITTED は、SQL ServerSQL Server の既定の分離レベルです。READ COMMITTED is the default isolation level in SQL ServerSQL Server. セッションの分離レベルが READ COMMITED (またはそれ以下) の場合は、次のいずれかの操作を実行できます。When the isolation level of the session is READ COMMITED (or lower), you can do one of the following:

  • メモリ最適化テーブルにアクセスするためにより高い分離レベルのヒントを明示的に指定する (WITH (SNAPSHOT) など)。Explicitly use a higher isolation level hint for accessing the memory-optimized table (for example, WITH (SNAPSHOT)).

  • MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT 設定オプションを指定する。これにより、(各メモリ最適化テーブルに WITH(SNAPSHOT) ヒントを含めた場合のように) メモリ最適化テーブルの分離レベルが SNAPSHOT に設定されます。Specify the MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT set option, which will set the isolation level for memory-optimized tables to SNAPSHOT (as if you included WITH(SNAPSHOT) hints to every memory-optimized table). 詳細についてはMEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOTを参照してくださいALTER DATABASE SET Options (TRANSACT-SQL)します。For more information about MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT, see ALTER DATABASE SET Options (Transact-SQL).

    または、セッションの分離レベルが READ COMMITTED である場合は、自動コミット トランザクションを使用できます。Alternatively, if the isolation level of the session is READ COMMITTED, you can use autocommit transactions.

    解釈された Transact-SQLTransact-SQL で開始される SNAPSHOT トランザクションは、メモリ最適化テーブルにアクセスできません。SNAPSHOT transactions started in interpreted Transact-SQLTransact-SQL cannot access memory-optimized tables.

    メモリ最適化テーブルでサポートされるトランザクション分離レベルでは、ディスク ベース テーブルの場合と同じ論理的な保証が得られます。The transaction isolation levels supported for memory-optimized tables provide the same logical guarantees as disk-based tables. ただし、分離レベルの保証を提供するために使用されるメカニズムは異なります。The mechanism used for providing isolation level guarantees is different.

    ディスク ベース テーブルの場合、ほとんどの分離レベルの保証は、ブロックを通じて競合を回避するロックを使用して実装されます。For disk-based tables, most isolation level guarantees are implemented using locking, which prevent conflicts through blocking. メモリ最適化テーブルの場合、保証は競合検出メカニズムを使用して適用され、ロックを使用する必要はなくなります。For memory-optimized tables, the guarantees are enforced using a conflict detection mechanism, which avoids the need to take locks. 例外は、ディスク ベース テーブルでの SNAPSHOT 分離です。The exception is SNAPSHOT isolation on disk-based tables. この場合は、競合検出メカニズムを使用して、メモリ最適化テーブルでの SNAPSHOT 分離と同じように実装されます。This is implemented similarly to SNAPSHOT isolation on memory-optimized tables using a conflict detection mechanism.

    SNAPSHOTSNAPSHOT
    この分離レベルでは、トランザクションの任意のステートメントによって読み取られるデータが、トランザクションの開始時に存在していたトランザクション上の一貫性のあるバージョンのデータであることを指定します。This isolation level 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 statements in a transaction get a snapshot of the committed data as it existed at the start of the transaction.

    書き込み操作 (更新、挿入、および削除) は、他のトランザクションから常に完全に分離されます。Write operations (updates, inserts and deletes) are always fully isolated from other transactions. したがって、SNAPSHOT トランザクションの書き込み操作は、他のトランザクションの書き込み操作と競合する場合があります。Therefore, the write operations in a SNAPSHOT transaction can conflict with write operations by other transactions. 現在のトランザクションの開始以降にコミットされた他のトランザクションによって更新または削除された行を現在のトランザクションで更新または削除しようとすると、トランザクションは次のエラー メッセージにより終了されます。When the current transaction attempts to update or delete a row that has been updated or deleted by another transaction that committed after the current transaction started, the transaction terminates with the following error message.

    エラー 41302。Error 41302. 現在のトランザクションが、トランザクションが開始してから更新されたテーブル X のレコードを更新しようとしました。The current transaction attempted to update a record in table X that has been updated since this transaction started. トランザクションは中止されました。The transaction was aborted.

    現在のトランザクションの前にコミットされた他のトランザクションによって挿入された行と同じ主キー値を持つ行を現在のトランザクションで挿入しようとすると、次のエラー メッセージによりコミットが失敗します。When the current transaction attempts to insert a row with the same primary key value as a row that was inserted by another transaction that committed before the current transaction, there will be a failure to commit with the following error message.

    エラー 41325 です。Error 41325. 現在のトランザクションは、SERIALIZABLE の検証の失敗が原因でコミットされませんでした。The current transaction failed to commit due to a serializable validation failure.

    トランザクションのコミット前に削除されたテーブルにトランザクションで書き込む場合、トランザクションは、次のエラー メッセージにより終了します。If a transaction writes to a table that is dropped before the transaction commits, the transaction terminates with the following error message:

    エラー 41305 です。Error 41305. 現在のトランザクションは、REPEATABLE READ の検証の失敗が原因でコミットされませんでした。The current transaction failed to commit due to a repeatable read validation failure.

    REPEATABLE READREPEATABLE READ
    この分離レベルには、SNAPSHOT 分離レベルで適用される保証が含まれています。This isolation level includes the guarantees given by SNAPSHOT isolation level. また、REPEATABLE READ では、トランザクションで読み取られる任意の行について、トランザクションのコミット時にこの行が他のトランザクションによって変更されていないことが保証されます。In addition, REPEATABLE READ guarantees that for any row that is read by the transaction, at the time the transaction commits the row has not been changed by any other transaction. トランザクションのそれぞれの読み取り操作は、トランザクションが完了するまで反復可能です。Every read operation in the transaction is repeatable up to the end of the transaction.

    現在のトランザクションの前にコミットされた他のトランザクションによって更新された行を現在のトランザクションで読み取った場合、コミットは次のエラー メッセージにより失敗します。If the current transaction has read any row that has then been updated by another transaction that has committed before the current transaction, the commit fails with the following error message.

    エラー 41305 です。Error 41305. 現在のトランザクションは、REPEATABLE READ の検証の失敗が原因でコミットされませんでした。The current transaction failed to commit due to a repeatable read validation failure.

    SERIALIZABLESERIALIZABLE
    この分離レベルには、REPEATABLE READ で適用される保証が含まれています。This isolation level includes the guarantees given by REPEATABLE READ. スナップショットとトランザクション終了の間にファントム行は表示されていません。No phantom rows have appeared between the snapshot and the end of the transaction. ファントム行は、選択、更新、または削除のフィルター条件に一致します。Phantom rows match the filter condition of a select, update, or delete.

    トランザクションは、同時実行トランザクションがないものであるかのように実行されます。The transaction is executed as if there are no concurrent transactions. すべてのアクションは、単一のシリアル化ポイント (コミット時) で実質的に発生します。All actions virtually occur at a single serialization point (commit time).

    これらの保証のいずれかに違反すると、トランザクションは次のエラー メッセージによりコミットされません。If any of these guarantees is violated, the transaction fails to commit with the following error message:

    エラー 41325 です。Error 41325. 現在のトランザクションは、SERIALIZABLE の検証の失敗が原因でコミットされませんでした。The current transaction failed to commit due to a serializable validation failure.

参照See Also

メモリ最適化テーブルに対するトランザクションの概要 Understanding Transactions on Memory-Optimized Tables
メモリ最適化テーブルでのトランザクション分離レベルに関するガイドライン Guidelines for Transaction Isolation Levels with Memory-Optimized Tables
メモリ最適化テーブルでのトランザクションの再試行ロジックのガイドラインGuidelines for Retry Logic for Transactions on Memory-Optimized Tables