【データベース】最速だけど最も危険!ダーティリードを許す「Read Uncommitted」|情報処理問題1000本ノック
データの正確性と、同時処理のスピードはトレードオフの関係にあります。今回は、4段階ある「トランザクション分離レベル」の中で最も制約が緩いレベルを攻略しましょう。
1. 【 問題 】:トランザクション分離レベル
【 問題 】 ANSI/ISOで定義されている4段階のトランザクション分離レベル(アイソレーションレベル)のうち、他のトランザクションがコミット(確定)していない未確定の変更データを読み取る現象(ダーティリード)の発生を許容するものはどれでしょうか?
① Read Uncommitted (未コミット読み取り)
② Read Committed (コミット済み読み取り)
③ Repeatable Read (反復可能読み取り)
④ Serializable (直列化可能)
2. 正解:
正解: ① Read Uncommitted(未コミット読み取り)
3. 解説:ロックをかけずにフライング読み込み
トランザクション分離レベルは、複数の処理が同時に動くときの「お互いの独立性の高さ」を表します。レベルが低いほど処理スピード(スルーブット)は上がりますが、不整合が起きやすくなります。
下に行くほどレベルが高く(厳格に)なり、有害な現象をブロックできます。
1. Read Uncommitted(←ココが正解!)
・特徴:他人が書き換えている最中のデータを「お構いなし」に読めます。
・発生する不整合:ダーティリード、ノンリピータブルリード、ファントムリード
2. Read Committed
・特徴:他人がコミットした(確定した)データだけを読みます。
・発生する不整合:ダーティリードを防ぐ(ブロックする)。残り2つは発生。
3. Repeatable Read
・特徴:自分の処理中に、他人がデータを書き換えても自分には見えません。
・発生する不整合:ファントムリード(行が追加される現象)のみ発生。
4. Serializable
・特徴:すべての処理を順番に1つずつ実行するのと同様の状態にします。
・発生する不整合:すべての有害な現象を完璧に防ぎます(最も安全)。
★ ②:Read Committed(コミット済み読み取り)は、名前の通り「コミットされたデータしか読まない」レベルなので、ダーティリードは発生しません。
1. 理解のコツ: 「書類の承認プロセス」をイメージしてください。まだ上司のハンコ(コミット)が押されていない、作成中の下書き書類を勝手にデスクから持ち出して使い始めてしまうレベルがRead Uncommitted(未コミット読み取り)です。書類が後から破棄(ロールバック)されるリスクがありますが、完成を待たずにすぐ動けるのでスピードだけは最速です。
2. 試験対策の視点: 「ダーティリードを許容する」「最も分離レベルが低い」という条件が来たら「Read Uncommitted」が一択です。試験では、この4つの分離レベルと、3大有害現象(ダーティ/ノンリピータブル/ファントム)が「どこまで防げるか」の対応表を丸暗記しておくことが、データベース分野の得点王への近道です。
4. まとめ
「他の処理が確定していないデータでも、お構いなしに読み取ってしまう最も低い分離レベル」。これがRead Uncommittedです。お金の計算など、1円の狂いも許されないシステムでは絶対に選んではいけない設定ですが、多少の誤差が許される統計データの集計など、速度を限界まで追い求めたいケースで限定的に使われます。