SQL Server における「コミット読み取り」と「繰り返し読み取り」の違い 質問する

SQL Server における「コミット読み取り」と「繰り返し読み取り」の違い 質問する

上記の分離レベルは非常に似ていると思います。主な違いは何か、わかりやすい例を挙げて説明していただけますか?

ベストアンサー1

読み取りコミットは、読み取られたデータがその時点でコミットされていることを保証する分離レベルです。これは、読み取り側が、中間のコミットされていない「ダーティ」読み取りを参照できないように制限するだけです。トランザクションが読み取りを再発行した場合に、同じデータが見つかるという保証はまったくありません。データは、読み取られた後に自由に変更できます。

繰り返し読み取りはより高い分離レベルであり、読み取りコミット レベルの保証に加えて、読み取られたデータは変更できないことも保証します。トランザクションが同じデータを再度読み取る場合、以前に読み取られたデータはそのままで、変更されずに読み取り可能になります。

次の分離レベルである serializable は、さらに強力な保証を行います。つまり、repeatable read が保証するすべてのことに加えて、後続の読み取りで新しいデータが表示されないことも保証します。

たとえば、テーブル T に 1 行の列 C があり、その値が「1」であるとします。次のような単純なタスクがあるとします。

BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;

これは、テーブル T から 1 分の遅延を挟んで 2 回の読み取りを実行する単純なタスクです。

  • READ COMMITTED の場合、2 番目の SELECT は任意のデータを返す可能性があります。同時トランザクションはレコードを更新、削除、新しいレコードを挿入する可能性があります。2 番目の SELECT は常に新しいデータを参照します。
  • REPEATABLE READ では、2 番目の SELECT で少なくとも最初の SELECT から返された行が変更されずに表示されることが保証されます。その 1 分間に同時トランザクションによって新しい行が追加される可能性はありますが、既存の行を削除または変更することはできません。
  • SERIALIZABLE 読み取りでは、2 番目の選択で最初の行とまったく同じ行が表示されることが保証されます。同時トランザクションによって行を変更したり、削除したり、新しい行を挿入したりすることはできません。

上記のロジックに従うと、SERIALIZABLE トランザクションは、作業を容易にする一方で、誰も行を変更、削除、挿入できないようにする必要があるため、常にすべての同時操作を完全にブロックしていることがすぐにわかります。.Net スコープのデフォルトのトランザクション分離レベルはSystem.Transactionsserializable であり、通常、これが結果として生じるひどいパフォーマンスを説明します。

最後に、SNAPSHOT 分離レベルもあります。SNAPSHOT 分離レベルは、シリアル化可能と同じ保証を行いますが、同時トランザクションがデータを変更できないことを要求しません。代わりに、すべてのリーダーが独自の世界バージョン (独自の「スナップショット」) を参照するように強制します。これにより、同時更新をブロックしないため、プログラミングが非常に簡単になり、非常にスケーラブルになります。ただし、この利点には、サーバー リソースの消費量が増えるという代償が伴います。

補足情報:

おすすめ記事