【データベース】2回目も絶対に同じ値!「Repeatable Read」|情報処理問題1000本ノック
Read Committedからさらに防御力を高め、「データの書き換わり」まで完全にロックするレベルです。何が防げて、何が防げないのかの境界線を見極めましょう。
1. 【 問題 】:トランザクション分離レベルの識別
【 問題 】 データベースのトランザクション分離レベルのうち、「ダーティリード」だけでなく、同一トランザクション内で同じデータを繰り返し読み込んだときに値が変わってしまう「ノンリピータブルリード(非反復読み取り)」の発生まで完全に防止されるものはどれでしょうか?
ただし、他のトランザクションが新しい行を挿入することによって、2回目の検索時に1回目にはなかったデータが出現する「ファントムリード」の発生は許容されるものとします。
① Read Uncommitted
② Read Committed
③ Repeatable Read
④ Serializable
2. 正解:
正解: ③ Repeatable Read(反復可能読み取り)
3. 解説:「自分が触った本には、鍵をかける」世界
Repeatable Read(リピータブル・リード)は、その名の通り「同じ読み取り(Read)が反復(Repeat)できる」ことを保証するレベルです。
・このレベルでは、自分が1回データを読み込むと、データベースはそのデータに対して「トランザクションが終わるまで、他人は変更しちゃダメ」という強力なロック(共有ロック)を維持します。
・そのため、他人が途中で値を書き換えてコミットしようとしても、自分の処理が終わるまで待たされることになります。
・結果として、自分が2回目に同じ場所を読んだとき、1回目と1の位まで完全に同じ値であることが保証されます。
・Repeatable Readがロックするのは、あくまで「自分が既に読み込んだ既存の行」だけです。
・まだ存在していない、空いているスペース(隙間)まではロックしていません。
・そのため、他人がその隙間に「新しい行をポロッと追加してコミットする」ことは禁止できません。その結果、2回目の範囲検索(例:歳が20歳以上の人を全件取得)をしたときに、1回目にはいなかったメンバーが幻(ファントム)のように現れてしまうのです。
1. 理解のコツ: 図書館の席に例えてみましょう。「自分が一度手に取って机に置いた本(既存のデータ)」は、席を立つまで誰にも触らせないようガッチリ抱え込んでいます(ノンリピータブル防止)。しかし、「隣の空いている席に、誰かが新しい本を新しくポンと置いていく(ファントムリード)」ことまでは防げない、というイメージです。
2. 試験対策の視点: 問題文に「リピータブルリード(非反復読み取り)は防止される」かつ「ファントムリードは許容される(発生する)」とあれば、100%この Repeatable Read が正解になります。英語名そのままで問題文に出ることが多いので、言葉の意味さえ掴めば一瞬で解けるサービス問題です。
4. まとめ
既存データの書き換えを絶対に許さない、非常に堅牢な分離レベルがRepeatable Readです。
※ちなみに、MySQL(InnoDB)という有名なデータベースでは、このRepeatable Readをさらに独自の技術で強化し、ファントムリードまで裏でこっそり防いでくれる仕組み(MVCC)が搭載されており、これがデフォルト設定になっています(実務知識として知っておくとカッコいい豆知識です!)。