【データベース】読み取り中の変化を防ぐ!「反復可能読み取り(リピータブルリード)」|情報処理問題1000本ノック
複数のトランザクションが同時に動くとき、どこまでデータの「割り込み」を許すか。4段階ある分離レベルのうち、上から2番目に厳格な「反復可能読み取り」を攻略しましょう。
1. 【 問題 】:トランザクションの分離レベル
【 問題 】 RDBMSのトランザクション分離レベル(アイソレーションレベル)のうち、「ダーティリード」と「ノンリピータブルリード(非再現可能読み取り)」の発生は防ぐことができるが、「ファントムリード(幻像読み取り)」が発生する可能性が残るものはどれでしょうか?
① 既存データの読み取り (Read Uncommitted)
② 確定データの読み取り (Read Committed)
③ 反復可能読み取り (Repeatable Read)
④ 直列化可能 (Serializable)
2. 正解:
正解: ③ 反復可能読み取り(Repeatable Read / リピータブルリード)
3. 解説:同じデータを何度読んでも「同じ」
「反復可能読み取り」という名前の通り、1つのトランザクションの中で同じデータを「反復」して何度読み込んでも、必ず同じ値が返ってくることを保証するレベルです。
・ダーティリード:×(発生しない)
→ 他の人が「まだ確定していない(コミット前)」の怪しいデータを読めてしまう現象。
・ノンリピータブルリード:×(発生しない)
→ 自分がさっき読んだデータを、他の人に「書き換え・削除」されて値が変わってしまう現象。
・ファントムリード:〇(発生する)
→ 自分がデータを範囲検索している最中に、他の人がデータを「新規追加」したため、2回目に検索したときにデータが「幻(ファントム)」のように増えている現象。
★ Read Committed:ダーティだけ防ぐ(ノンリピータブルとファントムは起きる)
★ Repeatable Read:ダーティとノンリピータブルを防ぐ(ファントムだけ起きる)
★ Serializable:すべて防ぐ(完璧だが処理が遅い)
1. 理解のコツ: あなたが本棚の特定の小説(データ)を読んでいる間、他の人がその小説の文字を書き換えることはできません。これが反復可能読み取りです。ただし、他の人が本棚の隙間に「新しい別の本(ファントム)」をコッソリ差し込むことは止められない、というイメージです。
2. 試験対策の視点: 「ダーティとノンリピータブルは発生しない」「ファントムリードは発生する」という組み合わせは、試験でピンポイントに狙われます。英語名の「Repeatable Read」でも選べるようにしておきましょう。
4. まとめ
「自分が処理している間のデータ書き換えは許さないが、新規追加だけは防げないレベル」。これが反復可能読み取り(Repeatable Read)です。多くのRDBMS(MySQLなど)でデフォルトや推奨の設定として採用されている、非常に重要度の高い分離レベルです。