トランザクション分離レベルとは(全体像)
トランザクションとは、「ひとまとまりで成功か失敗かを決めたい一連の処理」のことだよー。たくさんの処理が同時に走ると、お互いの作業途中が見えてしまって、おかしなデータを読んでしまうことがあるのー。
そこで、「他人の作業途中をどれくらい見せないか」の厳しさを段階で決めるのが分離レベルだよー。
身近にたとえると、みんなで1冊の共有ノートに同時に書き込む場面。書きかけ(鉛筆の下書き)まで他人に見せてしまうとまちがいのもと。書き終わるまで見せないようにすると安全だけど、その分だけ順番待ちが増えて遅くなるのー。
押さえるのは、弱い順に4段階あることと、防ぎたい3つの異常だよー。
詳しく:4段階と3つの異常だけ覚えれば戦える
ここが記事の心臓部。まず防ぎたい「3つの異常」から見ていこーね。これは同時に処理が走るときに起きる、困った読み取りのことだよー。
防ぎたい3つの異常
| 異常 | やさしい意味 |
|---|---|
| ダーティリード | まだ確定していない書きかけを読んでしまう |
| 反復不能読み取り | 同じものを2回読んだら値が変わっていた |
| ファントムリード | 同じ条件で読んだら行の数が増減していた |
次に、その異常をどこまで防ぐかで分かれる4段階だよー。下にいくほど厳しくて安全、でも遅くなるのー。
分離レベル4段階(弱い→強い)
| レベル | 防げる範囲 |
|---|---|
| READ UNCOMMITTED | 一番弱い。ダーティリードも起きる |
| READ COMMITTED | ダーティリードを防ぐ |
| REPEATABLE READ | 反復不能読み取りまで防ぐ |
| SERIALIZABLE | 一番強い。3つの異常を全部防ぐ(でも一番遅い) |
ここで一番のひっかけが「どのDBMS(データベースソフト)も同じ設定で動いている」という思い込みだよー。実は標準のレベルはソフトによって違うのー。
代表的なDBMSの初期設定
| DBMS | 標準の分離レベル |
|---|---|
| PostgreSQL | READ COMMITTED |
| MySQL(InnoDB) | REPEATABLE READ |
もう1つのひっかけが「一番強いSERIALIZABLEを常に使えばよい」という誤解。強いレベルは安全だけど処理が遅くなるから、本当に必要なときだけ使うのー。安全と速さのバランス(トレードオフ)を選ぶのが大事なんだよー。
わかりやすく言い換えると
要するに、共有ノートのたとえでイメージするとラクだよー。
①ダーティリード … 鉛筆の下書き(未確定)を他人に読まれてしまう
②反復不能読み取り … さっき読んだ数字が、もう一度見たら書き換わっていた
③ファントムリード … さっき3行だった一覧が、もう一度見たら4行に増えていた
レベルを強くするほど「他人の作業途中が見えなくなる」から安全。でもその分、順番待ちが増えて遅くなる——つまり安全と速さは引っぱり合うのー。
試験のツボ
🔴 一番出る:4段階の順番と強さ
①弱い順に READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ → SERIALIZABLE
②強いほど安全だが遅い(トレードオフ)
🔴 次に出る:防ぎたい3つの異常
①ダーティリード(未確定の書きかけを読む)
②反復不能読み取り(同じ読みで値が変わる)
③ファントムリード(同じ読みで行数が変わる)
🟡 押さえると安定:DBMSで標準が違う
①PostgreSQL = READ COMMITTED
②MySQL(InnoDB) = REPEATABLE READ
よくある間違い
①「どのデータベースソフトも標準の分離レベルは同じ」→ ✗ PostgreSQLはREAD COMMITTED、MySQLはREPEATABLE READで違う。
②「一番強いSERIALIZABLEを常に使えばよい」→ ✗ 強いと遅くなるので、必要なときだけ使う。安全と速さのバランスで選ぶ。
③「READ UNCOMMITTEDが一番安全なレベルである」→ ✗ READ UNCOMMITTEDは一番弱い。一番安全(強い)のはSERIALIZABLE。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(4段階の強さ)
トランザクション分離レベルに関する次の記述のうち、正しいものはどれか。
- 分離レベルは、強くするほど処理の速さも一緒にどんどん速く上がっていくものなのだとされているのである
- 分離レベルが一番強いのはSERIALIZABLEで、3つの異常を全部防ぐが処理は遅くなりやすい
- 分離レベルは、READ UNCOMMITTEDが一番強くて安全なレベルだとされている
- 分離レベルは、画面の明るさを段階で決めるための専用の設定のことだとされているのである
解答は 2 だよー。
分離レベルで一番強いのはSERIALIZABLEで、3つの異常を全部防ぐかわりに処理は遅くなりやすいのー。強い=安全だけど遅い、というバランスだよー。
選択肢1の「強くすると速くなる」は逆で、強いほど遅くなるのー。選択肢3の「READ UNCOMMITTEDが一番強い」も誤りで、これは一番弱いレベルだよー。選択肢4の「明るさの設定」も関係ないのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 強くすると遅くなる(速くならない) |
| 2 | ✓ | SERIALIZABLEは最強で全異常を防ぐが遅い |
| 3 | ✗ | READ UNCOMMITTEDは一番弱いレベル |
| 4 | ✗ | 画面の明るさの設定ではない |
オリジナル問題2(3つの異常)
分離レベルで防ぎたい異常に関する次の記述のうち、正しいものはどれか。
- ダーティリードとは、画面が必ず暗くなってしまうという不具合のことだとされているものである
- ダーティリードとは、音が必ず二重に鳴る不具合のことだとされているもの
- ダーティリードとは、保存した文字が必ず全部消える不具合のことだとされているもの
- ダーティリードとは、まだ確定していない書きかけのデータを読んでしまうことなのである
解答は 4 だよー。
ダーティリードは、まだ確定していない書きかけのデータを読んでしまうことなのー。共有ノートで、他人の鉛筆の下書きを読んでしまう感じだよー。
選択肢1の「画面が暗くなる」、選択肢2の「音が二重に鳴る」、選択肢3の「文字が消える」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 画面の不具合のことではない |
| 2 | ✗ | 音の不具合のことではない |
| 3 | ✗ | 文字が消える不具合のことではない |
| 4 | ✓ | 未確定の書きかけを読んでしまうこと |
オリジナル問題3(DBMSのデフォルト)
DBMSの標準の分離レベルに関する次の記述のうち、正しいものはどれか。
- PostgreSQLはREAD COMMITTED、MySQLはREPEATABLE READが標準
- どのデータベースソフトでも標準は必ずSERIALIZABLEで設定は同じだとされているのである
- PostgreSQLもMySQLも標準は必ずREAD UNCOMMITTEDで固定だとされているのである
- 標準の分離レベルはソフトとは全く関係なく画面の色だけで決まるものだとされているのである
解答は 1 だよー。
標準の分離レベルはソフトによって違って、PostgreSQLはREAD COMMITTED、MySQL(InnoDB)はREPEATABLE READなのー。「どれも同じ」という思い込みがひっかけだよー。
選択肢2の「どれも必ずSERIALIZABLE」、選択肢3の「どれもREAD UNCOMMITTED固定」は誤りなのー。選択肢4の「画面の色で決まる」も関係ないよー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | PostgreSQL=READ COMMITTED、MySQL=REPEATABLE READ |
| 2 | ✗ | ソフトで違い、同じではない |
| 3 | ✗ | READ UNCOMMITTED固定ではない |
| 4 | ✗ | 画面の色で決まるものではない |
まとめ
押さえどころ
- 🔴 4段階 = 弱い順に READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ → SERIALIZABLE。強いほど安全だが遅い(トレードオフ)。
- 🔴 3つの異常 = ダーティリード(未確定の読み)・反復不能読み取り(同じ読みで値が変わる)・ファントムリード(同じ読みで行数が変わる)。
- 🟡 DBMSで標準が違う = PostgreSQLはREAD COMMITTED、MySQL(InnoDB)はREPEATABLE READ。
次に学ぶ
- トランザクションACID ── 信頼の4つの約束。分離レベルはこの「独立性(I)」をどこまで守るかの段階。
- 並行制御(2PL・MVCC) ── 同時実行を正しく保つしくみ。分離レベルを実際に支える土台。
- デッドロック ── 互いに待ち合って動けなくなる状態。同時実行の「困ること」の代表。
執筆: SikakuQuest編集部