トランザクション・排他制御・分離レベル 重要度:★★★出題: AM2・PM1・PM2
ダーティリード・ノンリピータブルリード・ファントムリードの厳密比較
だーてぃりーどのんりぴーたぶるりーどふぁんとむりーど / Dirty Read, Non-Repeatable Read & Phantom Read
複数トランザクションの同時実行時に発生する3種類の代表的な読取り異状(未コミット読取り、再読取り時の値変化、再検索時の対象行増減)。
3行速習ポイント
- ダーティリード:他トランザクションがUPDATE/INSERTしてまだコミットしていないデータを読み取ってしまい、その後ロールバックされると存在しない値に基づいた処理になる現象
- ノンリピータブルリード(ファジーリード):同一トランザクション内で同じ行を2回SELECTした間に、他トランザクションがその行をUPDATEしてコミットしたため1回目と2回目で異なる値が返る現象
- ファントムリード:同一トランザクション内で同じ検索条件(WHERE句)を2回実行した間に、他トランザクションが条件に合致する行をINSERT(またはDELETE)してコミットしたため行集合が変化する現象
図解
図3つの読取り異状の発生要因と防止策
未コミット参照
ダーティリード
他トランザクションの未コミット更新行を参照(READ COMMITTED以上で防止)
既存行の更新
ノンリピータブルリード
同一行の2回参照の間に他TxがUPDATEコミット(REPEATABLE READまたはFOR UPDATEで防止)
新規行の追加
ファントムリード
同一条件の2回検索の間に他TxがINSERT/DELETEコミット(SERIALIZABLEまたは範囲ロックで防止)
概要と本質
令和7年午後II問1設問1(2)の採点講評でも「ノンリピータブルリード,ファントムリードが発生する条件を正しく理解し,適切なトランザクション分離レベルを判断する技術を身に付けてほしい」と強調されている最重要テーマです。
重要ポイント・コア概念
- ノンリピータブルリードが発生しない条件:①同じ行をトランザクション内で複数回読み込まない場合、または②最初に読み込む際にFOR UPDATE等で専有ロックを取得している場合
- ファントムリードが発生する典型例:トランザクション内のステップ1で条件Aに合致する行を集計し、ステップ2で同じ条件Aに合致する行を更新(または再取得)する間に、別トランザクションが条件Aを満たす新行をINSERTしてコミットした場合
- ファントムリードを防ぐには:分離レベルをSERIALIZABLEにするか、述語ロック(インデックスキー範囲ロック / Next-Key Lock)または親テーブル行での排他ロックを行う
午後I・午後II記述試験での攻略ポイント
午後試験で「分離レベルをREAD COMMITTEDとした場合、ノンリピータブルリードは発生するか?ファントムリードは発生するか?その理由は何か?」と問われたら、トランザクション内の各ステップで「同一行の2回読込みがあるか」「他トランザクションによるINSERT行が途中のステップから混入するか」をステップ番号付きで具体的に指摘してください。
午後記述で使える加点キーワード(クリックでコピー)
この用語が出題された過去問を解く(1分演習)
即時アウトプットで定着データベーススペシャリスト 過去問演習で実践力を鍛える