分離レベル ぶんりれべる
トランザクション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を分散環境で実現
分離レベルと異常現象の関係図
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| ISO/IEC 9075 SQL-92 | 4段階の分離レベルを最初に標準化 |
| ANSI/ISO SQL-99以降 | スナップショット分離(SI)の概念が議論に加わる |
関連用語
- トランザクション — 一連のDB操作をひとまとめに扱う仕組み
- ACID特性 — トランザクションが満たすべき4つの性質
- ロック(排他制御) — データの同時更新を防ぐためにアクセスを制限する仕組み
- デッドロック — 複数トランザクションが互いにロック待ちとなり停止する状態
- MVCC — ロックを最小化しながら整合性を保つ並行処理技術
- 楽観ロック・悲観ロック — 同時更新を制御する2つのアプローチ
- コミット・ロールバック — トランザクションを確定または取り消す操作