データベース操作・制御

分離レベル ぶんりれべる

トランザクションACID特性ダーティリードファントムリード同時実行制御独立性
分離レベルについて教えて

簡単に言うとこんな感じ!

分離レベルは「複数人が同時にDBを触るとき、どこまで互いを見えなくするか」の設定だよ! 完全に遮断すれば安全だけど遅くなる、ゆるくすれば速いけど変なデータが見える可能性がある。安全性と速度のトレードオフを4段階で調整できるんだ!


分離レベルとは

**分離レベル(Isolation Level)とは、複数のトランザクションが同時実行される際に、互いの処理がどこまで「見えてしまうか(干渉するか)」を制御するパラメータです。ACID特性のI(Isolation:独立性)**をどの程度厳密に保証するかを4つの段階で定義しています。

分離レベルを厳しくするほど「他のトランザクションの未確定データが見えない=安全」になりますが、同時にロック競合が増えてパフォーマンスが低下します。逆に緩くすれば速くなりますが、ダーティリード・ノンリピータブルリード・ファントムリードと呼ばれる異常現象が発生する可能性があります。システムの性格(決済系か分析系かなど)に応じて適切なレベルを選択することが重要です。


4つの分離レベルと発生しうる異常現象

分離レベルダーティリードノンリピータブルリードファントムリード一般的な用途
READ UNCOMMITTED発生する発生する発生するログ集計など近似値でよい場合
READ COMMITTED発生しない発生する発生する多くのDBのデフォルト(Oracle等)
REPEATABLE READ発生しない発生しない発生するMySQLのデフォルト
SERIALIZABLE発生しない発生しない発生しない金融・決済など最高の安全性が必要な場合

異常現象の説明

異常現象内容
ダーティリード他のトランザクションがまだコミットしていない変更を読んでしまうAがロールバックする前のデータをBが読んで処理してしまう
ノンリピータブルリード同一トランザクション内で同じ行を2回読むと値が変わってしまう在庫確認→処理中に他者が更新→再確認で値が変わっている
ファントムリード同一トランザクション内で同じ条件で検索すると、途中で行が増減してしまう「在庫あり」商品を一覧取得→処理中に新商品が追加される

歴史と背景

  • 1983年:ジム・グレイらがトランザクション理論でIsolationを定式化
  • 1992年:SQL-92国際標準でREAD UNCOMMITTED / READ COMMITTED / REPEATABLE READ / SERIALIZABLEの4段階が規定される
  • 1995年:Berenson らの論文「A Critique of ANSI SQL Isolation Levels」でSQL-92の定義の曖昧さを指摘。スナップショット分離(Snapshot Isolation)の概念が提唱される
  • 2000年代MVCCを採用するPostgreSQL・OracleなどがスナップショットベースのREPEATABLE READを実装。SQL標準とは若干異なる挙動を持つ
  • 2010年代〜:分散DBでの分離レベル実装が難題として認識。Google Spannerは外部整合性を持つSERIALIZABLEを分散環境で実現

分離レベルと異常現象の関係図

分離レベルのトレードオフ ← 安全性 高い パフォーマンス 高い → SERIALIZABLE 異常なし 最も安全・最も遅い 金融・決済に最適 REPEATABLE READ ファントムのみ MySQLデフォルト READ COMMITTED ダーティなし PostgreSQL/Oracleデフォルト READ UNCOMMITTED すべて発生する可能性 近似値OKな集計のみ SQLでの設定例(PostgreSQL) -- セッション単位で設定 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- またはトランザクション単位で指定

関連する規格・RFC

規格内容
ISO/IEC 9075 SQL-924段階の分離レベルを最初に標準化
ANSI/ISO SQL-99以降スナップショット分離(SI)の概念が議論に加わる

関連用語