1. ホーム
  2. sql

[解決済み】"read commited" と "repeatable read" の違いについて

2022-03-29 08:47:39

質問

上記のアイソレーション・レベルはとてもよく似ていると思います。どなたか素敵な例を挙げて、何が違うのか説明していただけませんか?

解決方法は?

リードコミットとは、読み込まれたすべてのデータが コミット が読み込まれた時点で これは単に、中間的な、コミットされていない、「ダーティ」な読み出しを読者が見ることを制限しているに過ぎません。これは、トランザクションが読み込みを再発行したときに、そのトランザクションに含まれる 同じ データは、読み込まれた後に自由に変更することができます。

反復読み込みは、より高い分離レベルで、読み込みコミット・レベルの保証に加え、読み込まれたすべてのデータについて 変更不可 トランザクションが同じデータを再度読み込むと、前回読み込んだデータがそのまま残っていて、読み込める状態になっていることがわかります。

次の分離レベルであるシリアライザブルは、さらに強力な保証を行います:すべての繰り返し読み取りの保証に加えて、次のことも保証します。 いいえ 新しい データ は、その後の読み込みで見ることができます。

例えば、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 は、以下のような結果を返すかもしれません。 任意の のデータを使用します。同時実行トランザクションは、レコードを更新したり、削除したり、新しいレコードを挿入したりすることができます。2番目のセレクトは常に 新しい のデータです。
  • REPEATABLE READ では、2 番目の SELECT は少なくとも最初の SELECT から返された行を表示することが保証されています。 変更なし . その1分間で同時実行中のトランザクションによって新しい行を追加することはできますが、既存の行を削除したり変更したりすることはできません。
  • SERIALIZABLE 読み込みの場合、2 番目の select には、以下のものが表示されることが保証されています。 まさに は最初の行と同じです。同時実行中のトランザクションによって、行が変更されたり、削除されたり、新しい行が挿入されたりすることはない。

上記のロジックに従えば、SERIALIZABLEトランザクションは、あなたの生活を便利にするかもしれませんが、常に、次のようなものであることにすぐに気づくことができます。 完全ブロッキング なぜなら、誰も行を変更、削除、挿入できないようにする必要があるからです。.Netのデフォルトのトランザクション分離レベルは System.Transactions スコープがシリアライズ可能であるため、通常、このようなひどいパフォーマンスになるのです。

そして最後に、SNAPSHOT アイソレーション・レベルもあります。SNAPSHOT分離レベルはserializableと同じ保証をしますが、同時実行トランザクションがデータを変更できないことを要求するのではありません。その代わり、全ての読み手は自分自身の世界のバージョン(自分自身の'スナップショット')を見ることを強制されます。このため、同時更新をブロックしないので、非常にスケーラブルであると同時に、プログラムも非常に簡単になります。しかし、この利点には代償として、余分なサーバーリソースを消費することになります。

補足の読み方