Open2

リード現象とトランザクション分離レベル

よつよつ

データベーススペシャリストにたびたび登場するので、まとめました。

リード現象

トランザクションを実行したとき、予期しないデータが返ること。
例えば、同じトランザクションでまったく同じ SELECT 文を実行したのに結果が違う、など。

後述する 3 つのパターンが存在する。

トランザクション分離レベル

リード現象が起こらないように設けられる、トランザクションをどれほどの一貫性・正確性で実行するかのレベルのこと。
言い方を変えれば、 ACID 特性のうちの I(Isoration、独立性) を担保するためのシステム。

これも後述する 4 つのパターンがある。

ACID 特性について(ざっくり)

トランザクションには、以下に示す4つの特性がある。

  • 原子性(Atomicity):トランザクションは、完全に実行されるかまったく実行されない。つまり、中途半端に終了することはない。
  • 一貫性(Consistency):トランザクションの実行前後で、データベースの整合性(設けられた様々な制約が正しく守られているか)が保たれる。
  • 独立性(Isoration):トランザクションは、互いに影響を受けない。
  • 耐久性(Durability):もしデータベースがダウンしたとしても、データが失われない。

これらの頭文字をとって ACID 特性 と表現する。

よつよつ

リード現象

すべての場合において、「トランザクションが互いに干渉している」「トランザクションの独立性が保てていない」という視点で見るとよい。

アンリピータブルリード(Unrepeatable Read)


同じトランザクション内で複数回おなじ行を読み込んだとき、結果が異なる異常。
一度目の参照と二度目の参照の間に、別のトランザクションで更新処理が行われることによっておこる。

ダーティリード(Dirty Read)


これはすこし複雑だが、

  1. 他のトランザクションによって値を更新する
  2. 更新された値を参照する
  3. 値を更新したトランザクションがロールバックする

という流れで、結果的に 存在しない値(一時的に存在する値) を参照してしまうこと。
これはさっきの逆で、更新処理の間に参照処理が入ってしまった際に発生することがある。

ファントムリード(Phantom Read)


同じトランザクション内で複数回データを取得したとき、前回まではなかった値が現れたり、前回は存在した値が消失したりすること。
取得の前後で追加・削除処理が入ることによって発生する。

説明だけ聞くとアンリピータブルリードに似ているが、前者は値に注目しているのに対し、後者は行そのものが追加・削除されている。