メモリ最適化テーブルにアクセスするトランザクションでは、次の分離レベルがサポートされています。
スナップショット
反復可能な読み取り
シリアライズ可能
リードコミット
トランザクション分離レベルは、ネイティブ コンパイル ストアド プロシージャのアトミック ブロックの一部として指定できます。 詳細については、「CREATE PROCEDURE (Transact-SQL)」を参照してください。 解釈された Transact-SQL からメモリ最適化テーブルにアクセスする場合は、テーブル レベルのヒントを使用して分離レベルを指定できます。
ネイティブ コンパイル ストアド プロシージャを定義するときは、トランザクション分離レベルを指定する必要があります。 解釈された Transact-SQL のユーザー トランザクションからメモリ最適化テーブルにアクセスする場合は、テーブル ヒントで分離レベルを指定する必要があります。 詳細については、「 Memory-Optimized テーブルを使用したトランザクション分離レベルのガイドライン」を参照してください。
自動コミット トランザクションを使用するメモリ最適化テーブルでは、分離レベル READ COMMITTED がサポートされています。 READ COMMITTED は、ユーザー トランザクションまたはアトミック ブロックでは無効です。 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
set オプションを指定します。これは、メモリ最適化テーブルの分離レベルを SNAPSHOT に設定します (WITH(SNAPSHOT) ヒントをすべてのメモリ最適化テーブルに含めたかのように)。MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT
の詳細については、「ALTER DATABASE SET Options (Transact-SQL)」を参照してください。
または、セッションの分離レベルが READ COMMITTED の場合は、自動コミット トランザクションを使用できます。
解釈された Transact-SQL で開始された SNAPSHOT トランザクションは、メモリ最適化テーブルにアクセスできません。
メモリ最適化テーブルでサポートされるトランザクション分離レベルは、ディスク ベースのテーブルと同じ論理保証を提供します。 分離レベルの保証を提供するために使用されるメカニズムは異なります。
ディスク ベースのテーブルの場合、ほとんどの分離レベルの保証はロックを使用して実装され、ブロックによる競合を防ぎます。 メモリ最適化テーブルの場合、競合検出メカニズムを使用して保証が適用されるため、ロックを取る必要がなくなります。 ディスクベースのテーブルにおける唯一の例外は、SNAPSHOTアイソレーションです。 これは、競合検出メカニズムを使用してメモリ最適化テーブルの SNAPSHOT 分離と同様に実装されます。
スナップショット
この分離レベルは、トランザクション内のステートメントによって読み取られたデータが、トランザクションの開始時に存在していたデータのトランザクション整合性バージョンであることを指定します。 トランザクションは、トランザクションの開始前にコミットされたデータ変更のみを認識できます。 現在のトランザクションの開始後に、他のトランザクションによってデータが変更されても、現在のトランザクションを実行しているステートメントではデータの変更は認識されません。 トランザクション内のステートメントは、トランザクションの開始時に存在していたコミット済みデータのスナップショットを取得します。
書き込み操作 (更新、挿入、削除) は、常に他のトランザクションから完全に分離されます。 したがって、SNAPSHOT トランザクションの書き込み操作は、他のトランザクションによる書き込み操作と競合する可能性があります。 現在のトランザクションが、現在のトランザクションの開始後にコミットされた別のトランザクションによって更新または削除された行を更新または削除しようとすると、トランザクションは次のエラー メッセージで終了します。
エラー 41302。 現在のトランザクションは、このトランザクションの開始後に更新されたテーブル X のレコードを更新しようとしました。 トランザクションが中止されました。
現在のトランザクションが、現在のトランザクションの前にコミットされた別のトランザクションによって挿入された行と同じ主キー値を持つ行を挿入しようとすると、次のエラー メッセージでコミットに失敗します。
エラー 41325。 シリアル化可能な検証エラーのため、現在のトランザクションのコミットに失敗しました。
トランザクションがコミットする前に削除されたテーブルにトランザクションが書き込まれた場合、トランザクションは次のエラー メッセージで終了します。
エラー 41305。 反復可能な読み取り検証エラーのため、現在のトランザクションのコミットに失敗しました。
反復可能な読み取り
この分離レベルには、SNAPSHOT 分離レベルによって提供される保証が含まれます。 また、REPEATABLE READ では、トランザクションによって読み取られた行に対して、トランザクションがコミットした時点でその行が他のトランザクションによって変更されていないことが保証されます。 トランザクション内のすべての読み取り操作は、トランザクションの最後まで繰り返し実行できます。
現在のトランザクションが、現在のトランザクションの前にコミットされた別のトランザクションによって更新された行を読み取った場合、コミットは次のエラー メッセージで失敗します。
エラー 41305。 反復可能な読み取り検証エラーのため、現在のトランザクションのコミットに失敗しました。
シリアライズ可能
この分離レベルには、REPEATABLE READ によって提供される保証が含まれます。 スナップショットとトランザクションの終了の間にファントム行は表示されていません。 ファントム行は、選択、更新、または削除のフィルター条件と一致します。
トランザクションは、同時実行トランザクションがないかのように実行されます。 すべてのアクションは、実質的に 1 つのシリアル化ポイント (コミット時) に発生します。
これらの保証のいずれかに違反した場合、トランザクションは次のエラー メッセージでコミットに失敗します。
エラー 41325。 シリアル化可能な検証エラーのため、現在のトランザクションのコミットに失敗しました。
こちらもご覧ください
Memory-Optimized テーブルのトランザクションについて
Memory-Optimized テーブルでのトランザクション分離レベルのガイドライン
Memory-Optimized テーブルでのトランザクションの再試行ロジックのガイドライン