次の方法で共有


メモリ最適化テーブルのトランザクション分離レベル

メモリ最適化テーブルにアクセスするトランザクションでは、次の分離レベルがサポートされています。

  • SNAPSHOT

  • REPEATABLE READ

  • SERIALIZABLE

  • READ COMMITTED

トランザクション分離レベルは、ネイティブ コンパイル ストアド プロシージャの ATOMIC ブロックの一部として指定できます。 詳細については、「CREATE PROCEDURE (Transact-SQL)」を参照してください。 解釈された Transact-SQL からメモリ最適化テーブルにアクセスする場合は、テーブル レベルのヒントを使用して分離レベルを指定できます。

ネイティブ コンパイル ストアド プロシージャを定義する際には、トランザクション分離レベルを指定する必要があります。 解釈された Transact-SQL のユーザー トランザクションからメモリ最適化テーブルにアクセスする場合は、テーブル ヒントで分離レベルを指定する必要があります。 詳細については、「 Memory-Optimized テーブルを使用したトランザクション分離レベルのガイドライン」を参照してください。

自動コミット トランザクションを使用するメモリ最適化テーブルでは、READ COMMITTED 分離レベルがサポートされます。 READ COMMITTED は、ユーザー トランザクションまたは ATOMIC ブロックでは無効です。 READ COMMITTED は、明示的または暗黙的なユーザー トランザクションではサポートされません。 自動コミット トランザクションを使用するメモリ最適化テーブルについては、クエリがどのディスク ベース テーブルにもアクセスできない場合にのみ、分離レベル READ_COMMITTED_SNAPSHOT がサポートされます。 さらに、SNAPSHOT 分離を使用して解釈された Transact-SQL を使用して開始されたトランザクションは、メモリ最適化テーブルにアクセスできません。 REPEATABLE READ または SERIALIZABLE 分離で解釈された Transact-SQL を使用するトランザクションは、SNAPSHOT 分離を使用してメモリ最適化テーブルにアクセスする必要があります。 このシナリオの詳細については、「 クロスコンテナー トランザクション」を参照してください。

READ COMMITTED は、SQL Serverの既定の分離レベルです。 セッションの分離レベルが READ COMMITED (またはそれ以下) の場合は、次のいずれかの操作を実行できます。

  • メモリ最適化テーブルにアクセスするためにより高い分離レベルのヒントを明示的に指定する (WITH (SNAPSHOT) など)。

  • MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT 設定オプションを指定する。これにより、(各メモリ最適化テーブルに WITH(SNAPSHOT) ヒントを含めた場合のように) メモリ最適化テーブルの分離レベルが SNAPSHOT に設定されます。 の詳細 MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOTについては、「 ALTER DATABASE SET Options (Transact-SQL)」を参照してください。

または、セッションの分離レベルが READ COMMITTED である場合は、自動コミット トランザクションを使用できます。

解釈された Transact-SQL で開始された SNAPSHOT トランザクションは、メモリ最適化テーブルにアクセスできません。

メモリ最適化テーブルでサポートされるトランザクション分離レベルでは、ディスク ベース テーブルの場合と同じ論理的な保証が得られます。 ただし、分離レベルの保証を提供するために使用されるメカニズムは異なります。

ディスク ベース テーブルの場合、ほとんどの分離レベルの保証は、ブロックを通じて競合を回避するロックを使用して実装されます。 メモリ最適化テーブルの場合、保証は競合検出メカニズムを使用して適用され、ロックを使用する必要はなくなります。 例外は、ディスク ベース テーブルでの SNAPSHOT 分離です。 この場合は、競合検出メカニズムを使用して、メモリ最適化テーブルでの SNAPSHOT 分離と同じように実装されます。

SNAPSHOT
この分離レベルでは、トランザクションの任意のステートメントによって読み取られるデータが、トランザクションの開始時に存在していたトランザクション上の一貫性のあるバージョンのデータであることを指定します。 データの変更は、トランザクションの開始前にコミットされたものだけが認識されます。 現在のトランザクションの開始後に、他のトランザクションによってデータが変更されても、現在のトランザクションを実行しているステートメントではデータの変更は認識されません。 トランザクション内のステートメントは、トランザクションの開始時に存在していたコミット済みデータのスナップショットを取得します。

書き込み操作 (更新、挿入、および削除) は、他のトランザクションから常に完全に分離されます。 したがって、SNAPSHOT トランザクションの書き込み操作は、他のトランザクションの書き込み操作と競合する場合があります。 現在のトランザクションの開始以降にコミットされた他のトランザクションによって更新または削除された行を現在のトランザクションで更新または削除しようとすると、トランザクションは次のエラー メッセージにより終了されます。

エラー 41302。 現在のトランザクションが、トランザクションが開始してから更新されたテーブル X のレコードを更新しようとしました。 トランザクションは中止されました。

現在のトランザクションの前にコミットされた他のトランザクションによって挿入された行と同じ主キー値を持つ行を現在のトランザクションで挿入しようとすると、次のエラー メッセージによりコミットが失敗します。

エラー 41325。 現在のトランザクションは、SERIALIZABLE の検証の失敗が原因でコミットされませんでした。

トランザクションのコミット前に削除されたテーブルにトランザクションで書き込む場合、トランザクションは、次のエラー メッセージにより終了します。

エラー 41305。 現在のトランザクションは、REPEATABLE READ の検証の失敗が原因でコミットされませんでした。

REPEATABLE READ
この分離レベルには、SNAPSHOT 分離レベルで適用される保証が含まれています。 また、REPEATABLE READ では、トランザクションで読み取られる任意の行について、トランザクションのコミット時にこの行が他のトランザクションによって変更されていないことが保証されます。 トランザクションのそれぞれの読み取り操作は、トランザクションが完了するまで反復可能です。

現在のトランザクションの前にコミットされた他のトランザクションによって更新された行を現在のトランザクションで読み取った場合、コミットは次のエラー メッセージにより失敗します。

エラー 41305。 現在のトランザクションは、REPEATABLE READ の検証の失敗が原因でコミットされませんでした。

SERIALIZABLE
この分離レベルには、REPEATABLE READ で適用される保証が含まれています。 スナップショットとトランザクション終了の間にファントム行は表示されていません。 ファントム行は、選択、更新、または削除のフィルター条件に一致します。

トランザクションは、同時実行トランザクションがないものであるかのように実行されます。 すべてのアクションは、単一のシリアル化ポイント (コミット時) で実質的に発生します。

これらの保証のいずれかに違反すると、トランザクションは次のエラー メッセージによりコミットされません。

エラー 41325。 現在のトランザクションは、SERIALIZABLE の検証の失敗が原因でコミットされませんでした。

参照

メモリ最適化テーブルを対象にするトランザクションについて
メモリ最適化テーブルのトランザクション分離レベルに関するガイドライン
メモリ最適化テーブルでのトランザクションの再試行ロジックのガイドライン