情報処理試験を勉強していると、「隔離性水準って何?READ COMMITTEDとREPEATABLE READは何が違うの?」と混乱しがちです。この記事では、隔離性水準(アイソレーションレベル)の意味と4段階の違いを、図解を交えて整理します。
対象試験と出題頻度
隔離性水準は、応用情報技術者で出題されるテーマです。
データベーススペシャリスト試験では定番の出題ですが、AP午前でもACID特性の「独立性(Isolation)」を深掘りする形で問われることがあります。
詳細をクリックして確認
応用情報技術者
★☆☆☆☆
ランクD(発展)参考程度
用語の定義
隔離性水準(アイソレーションレベル/Isolation Level)とは、一言で言うと
「複数のトランザクションを同時実行したとき、どの程度の読み取り異常を許容するかを4段階で定めたSQL標準の設定」
のことです。
イメージとしては、「図書館の閲覧ルールの厳しさ」です。
図書館で本を読んでいるとき、他の人がその本に付箋を貼ったり、ページを差し替えたりできるかどうかは、館のルールの厳しさによって決まります。
「誰でも自由にいじってOK」という緩いルールなら読んでいる最中に内容が変わってしまうし、「あなたが読み終わるまで誰も触れません」という厳しいルールなら安全だけど他の人は順番待ちになります。
隔離性水準も同じで、データベースにおいて「他のトランザクションの影響をどこまで遮断するか」のルールの厳しさを段階的に設定する仕組みです。
📊 隔離性水準の基本情報
| 項目 | 内容 |
|---|---|
| 英語名 | Isolation Level |
| 定義元 | ANSI/ISO SQL標準(SQL-92) |
| 設定方法 | SET TRANSACTION ISOLATION LEVEL 文 |
| 段階数 | 4段階(低い順:READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ → SERIALIZABLE) |
| 関連するACID特性 | 独立性(Isolation) |
解説
複数のトランザクションを完全に直列(1つずつ順番)に実行すればデータの矛盾は起きません。
しかし、それでは処理性能が大幅に低下します。
そこで、SQL標準では「ある程度の読み取り異常は許容してでも並行処理の効率を上げたい」というニーズに応えるため、直列化の制約を4段階にランク分けしました。これが隔離性水準です。
3つの読み取り異常
隔離性水準を理解するには、まずトランザクションの同時実行で起こりうる3つの異常を知る必要があります。
| 異常の名称 | 何が起きるか |
|---|---|
| ダーティリード | 他のトランザクションがまだコミットしていない更新データを読んでしまう。その後ロールバックされると、存在しないデータを読んだことになる |
| ノンリピータブルリード (ファジーリード) |
同じトランザクション内で同じ行を2回読んだとき、他のトランザクションによる更新で値が変わってしまう |
| ファントムリード | 同じトランザクション内で同じ検索条件を2回実行したとき、他のトランザクションによる行の挿入・削除で結果の行数が変わってしまう |
4段階の隔離性水準と異常の対応表
ここだけは確実に押さえてください。4つの水準と3つの異常の対応関係が、この用語の核心です。
📊 隔離性水準と読み取り異常の対応表
| 隔離性水準 (低い順 ↓) |
ダーティ リード |
ノンリピータブル リード |
ファントム リード |
並行性能 |
|---|---|---|---|---|
| READ UNCOMMITTED | 発生する | 発生する | 発生する | 最も高い |
| READ COMMITTED | 回避 | 発生する | 発生する | ↑ |
| REPEATABLE READ | 回避 | 回避 | 発生する | ↓ |
| SERIALIZABLE | 回避 | 回避 | 回避 | 最も低い |
▲ 上に行くほど制約が緩く高速、下に行くほど制約が厳しく安全
図解:隔離性水準のイメージ
水準が上がるごとに「防げる異常が1つずつ増える」と覚えるとシンプルです。
隔離性水準の段階イメージ(低→高)
UNCOMMITTED
ノンリピ ✕
ファントム ✕
COMMITTED
ノンリピ ✕
ファントム ✕
READ
ノンリピ ○
ファントム ✕
ノンリピ ○
ファントム ○
○=回避できる ✕=発生する|右へ行くほど安全だが並行処理の性能は下がる
SQL文での指定方法
隔離性水準はSQLのSET TRANSACTION文で指定します。参考として構文を示します。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 例:ファントムリードまで回避したい場合 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
多くのDBMSではデフォルトの隔離性水準としてREAD COMMITTEDが採用されています(PostgreSQL、Oracleなど)。MySQLのInnoDBではREPEATABLE READがデフォルトです。
では、この用語が試験でどのように出題されるか見ていきましょう。
💡 隔離性水準の核心を3行で
・トランザクション同時実行時に許容する異常の範囲を4段階で定めたSQL標準の設定
・異常は「ダーティリード → ノンリピータブルリード → ファントムリード」の3種類
・水準を上げるほど安全になるが、排他制御が厳しくなり並行性能は落ちる
試験ではこう出る!
隔離性水準は、APでは直接名指しで問われるケースは少なく、ACID特性の「独立性」やロックの話題と絡めて出題されます。
一方、データベーススペシャリスト(DB)試験の午前IIでは定番テーマです。DB試験の過去問がAP午前に流用される可能性があるため、4つの水準と3つの異常の対応表を押さえておくと安心です。
📊 関連する過去問での出題実績
| 試験回 | 出題内容 | 問われたポイント |
|---|---|---|
| DB R4秋 午前II 問14 |
ノンリピータブルリードの現象を回避できる最低限の水準を選ぶ問題。 | ・正解はREPEATABLE READ ・「最も水準の低いもの」と限定される形式に注意 |
| DB H31春 午前II 問9 |
ダーティリードは回避できるがノンリピータブルリードは許容する水準を選ぶ問題。 | ・正解はREAD COMMITTED ・2つの条件を同時に満たす水準を特定する形式 |
| SA R7春 午前II 問24 |
隔離性水準を高めたときの傾向を問う問題。 | ・水準を上げると不整合は減るが並行処理のスループットが低下する関係を理解しているかが焦点 |
📝 IPA試験での出題パターン
パターン1:「この異常を回避できる最低限の水準は?」
特定の読み取り異常が起きるシナリオを提示し、それを防げる水準のうち最も低いものを選ばせる形式。対応表を暗記していれば即答できる。
パターン2:「水準を上げたときの傾向は?」
「安全性↑ = 性能↓」のトレードオフを理解しているかを確認する形式。「スループットが低下する」「デッドロックのリスクが高まる」がひっかけ選択肢として登場する。
試験ではここまででOKです。各DBMSの実装差異(MySQLのギャップロックなど)まで問われることはないので、深追いは不要です。
【確認テスト】理解度チェック
ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。
Q. トランザクションT1がある行を読んだ後、別のトランザクションT2がその行を更新してコミットした。再びT1が同じ行を読むと、最初とは異なる値が得られた。この現象を回避できるSQL隔離性水準のうち、最も水準が低いものはどれか。
- A. READ UNCOMMITTED
- B. READ COMMITTED
- C. REPEATABLE READ
正解と解説を見る
正解:C
解説:
設問の現象は「ノンリピータブルリード(ファジーリード)」です。同一トランザクション内で同じ行を再読み込みした際に、間に入った別トランザクションの更新コミットによって値が変化しています。この異常を回避するには、REPEATABLE READ以上の水準が必要です。回避できる水準のうち最も低いものはREPEATABLE READです。
選択肢AのREAD UNCOMMITTEDは最も水準が低く、ダーティリード・ノンリピータブルリード・ファントムリードのすべてが発生します。選択肢BのREAD COMMITTEDはダーティリードは回避できますが、ノンリピータブルリードは依然として発生するため、設問の現象を防ぐことはできません。
よくある質問(FAQ)
Q. ノンリピータブルリードとファントムリードの違いがわかりません。
ノンリピータブルリードは「既存の行の値が変わる」現象です。一方、ファントムリードは「検索結果の行数が増減する」現象です。ノンリピータブルリードの原因は他トランザクションによるUPDATE、ファントムリードの原因はINSERTまたはDELETEです。REPEATABLE READでは読み取った行にロックがかかるため値の変化は防げますが、新たな行の挿入までは防げません。
Q. 実務で使われるデフォルトの隔離性水準はどれですか?
多くのRDBMS(PostgreSQL、Oracle、SQL Serverなど)ではREAD COMMITTEDがデフォルトです。ダーティリードを防ぎつつ、ある程度の並行性能を確保できるバランスの良い水準です。MySQLのInnoDBだけはREPEATABLE READがデフォルトという例外があり、MVCC(多版型同時実行制御)によってファントムリードも実質的に回避しています。
Q. SERIALIZABLEを常に使えば安全ではないのですか?
安全性は最大ですが、全トランザクションが実質的に直列実行されるため、同時接続ユーザが多いシステムではスループットが著しく低下します。また、ロックの範囲が広がるためデッドロックの発生頻度も上がります。そのため実務では必要最小限の水準を選択するのが一般的です。
Q. 隔離性水準とロックの種類(共有ロック・専有ロック)はどう関係しますか?
隔離性水準は「何を許容するか」の論理的な定義であり、ロックは「どうやって実現するか」の物理的な手段です。例えばREAD COMMITTEDでは読み取り時に共有ロックを取得するがSQL文の実行が終わるとすぐに解放するため、同じトランザクション内で再読み込みすると他のトランザクションによる更新が反映されてしまいます。REPEATABLE READではトランザクション終了まで共有ロックを保持するため、値の変化を防げます。