第4章 · トランザクションと同時実行制御·v1.0.0·更新 2026/7/10·読了目安 約17分
変更要約: 初版
4.3デッドロックと隔離性水準
この節の要点
デッドロックの待ちグラフによる検出と回避策、そしてREAD UNCOMMITTED・READ COMMITTED・REPEATABLE READ・SERIALIZABLEの4つの隔離性水準とダーティリード・反復不能読取り・ファントムリードの3つの読取り異常の対応関係、加えてMVCCを学び、整合性とスループットのバランスから最適な分離レベルを選ぶ判断力を養います。
在庫集計バッチと注文処理が同時に走る受発注システムを運用するDBAにとって、「どの隔離性水準を選ぶか」は、データの不整合リスクとシステム全体のスループットを両立させる最重要判断の1つです。最も厳格なSERIALIZABLEは全ての読取り異常を防ぎますが同時実行性を大きく犠牲にし、最も緩いREAD UNCOMMITTEDは高速ですがダーティリードすら許してしまいます。この節では、業務が許容できる不整合の種類を見極め、最適な隔離性水準を選ぶ判断力、およびデッドロックへの対処を学びます。
4.3.1デッドロックの検出と回避
- デッドロック=2つ以上のトランザクションが互いに相手が保持するロックの解放を待ち続け、両方とも先に進めなくなる状態。DBMSは各トランザクションの「誰が誰の解放を待っているか」を待ちグラフ(wait-for graph)として管理し、このグラフに循環(サイクル)が生じた時点でデッドロックと判定する。
- デッドロックへの対処は検出(detection)と回避(avoidance)の2方針がある。検出方式では、待ちグラフの循環を定期的にチェックし、循環を見つけたら関与するトランザクションの1つを犠牲者(victim)としてロールバックし他方を進行させる。回避方式では、ロック要求前にタイムスタンプ順などの規則(例:Wait-Die・Wound-Wait方式)で要求を許可するか即座に中断するかを判定し、そもそも循環が生じないようにする。
4.3.24つの隔離性水準と3つの読取り異常
- 3つの読取り異常:ダーティリード=他のトランザクションがまだCOMMITしていない(ロールバックされるかもしれない)変更を読んでしまう異常。反復不能読取り(Non-repeatable read)=同一トランザクション内で同じ行を2回読んだ際、間に他のトランザクションがCOMMITした更新により値が変わってしまう異常。ファントムリード=同一の検索条件で2回問い合わせた際、間に他のトランザクションが行を挿入/削除したことで行の集合(件数)が変わってしまう異常。
- 4つの隔離性水準は、この3つの異常のうちどこまで許すかで定義される:READ UNCOMMITTED(ダーティリード・反復不能読取り・ファントムリードの全てを許す)<READ COMMITTED(ダーティリードは防ぐが、反復不能読取りとファントムリードは起こり得る)<REPEATABLE READ(ダーティリードと反復不能読取りは防ぐが、ファントムリードは起こり得る)<SERIALIZABLE(3つの異常を全て防ぐ)。水準が上がるほど整合性は高まるがロック保持範囲が広がり同時実行性は下がる。

