コミットされた読み取りは、読み取られたデータがコミットされたことを保証する分離レベルです。 現時点で読まれています。それは単に、読者が中間の、コミットされていない、「ダーティ」な読み取りを見るのを制限するだけです。トランザクションが読み取りを再発行した場合に、同じが見つかることは、何の約束もありません。 データ、データは読み取られた後は自由に変更できます。
繰り返し可能な読み取りは、より高い分離レベルであり、読み取りコミットレベルの保証に加えて、読み取られたデータが変更されないことも保証します 、トランザクションが同じデータを再度読み取ると、以前に読み取ったデータが変更されずに読み取れるようになります。
次の分離レベルであるシリアライズ可能は、さらに強力な保証を行います。繰り返し可能なすべての読み取り保証に加えて、新しいがないことも保証します。 データ 後続の読み取りで確認できます。
1つの行を含む列Cを持つテーブルTがあり、値が「1」であるとします。そして、次のような単純なタスクがあると考えてください。
BEGIN TRANSACTION;
SELECT * FROM T;
WAITFOR DELAY '00:01:00'
SELECT * FROM T;
COMMIT;
これは、テーブルTから2つの読み取りを発行する単純なタスクであり、それらの間に1分の遅延があります。
- READ COMMITTEDの下で、2番目のSELECTは anyを返す場合があります データ。並行トランザクションは、レコードの更新、削除、新しいレコードの挿入を行う場合があります。 2番目の選択では、常に newが表示されます データ。
- REPEATABLE READの下で、2番目のSELECTは、少なくとも最初のSELECTから返された行を表示することが保証されています変更なし 。その1分間に同時トランザクションによって新しい行が追加される場合がありますが、既存の行を削除したり変更したりすることはできません。
- SERIALIZABLE読み取りの下で、2番目の選択が正確に表示されることが保証されます。 最初と同じ行。行を変更したり、削除したり、同時トランザクションによって新しい行を挿入したりすることはできません。
上記のロジックに従うと、SERIALIZABLEトランザクションは簡単になりますが、常に完全にブロックされていることがすぐにわかります。 誰も行を変更、削除、挿入できないようにする必要があるため、考えられるすべての同時操作。 .Net System.Transactions
のデフォルトのトランザクション分離レベル スコープはシリアル化可能であり、これは通常、結果として生じるひどいパフォーマンスを説明します。
そして最後に、SNAPSHOT分離レベルもあります。 SNAPSHOT分離レベルは、シリアル化可能と同じ保証を行いますが、同時トランザクションがデータを変更できないことを要求することによってではありません。代わりに、すべての読者に独自のバージョンの世界を表示するように強制します(独自の「スナップショット」)。これにより、同時更新をブロックしないため、プログラミングが非常に簡単になり、スケーラブルになります。ただし、そのメリットには代償が伴います。つまり、サーバーリソースの消費が増えます。
補足資料:
- データベースエンジンの分離レベル
- 並行性の影響
- 行のバージョン管理ベースの分離レベルの選択