トランザクション分離レベルとは?複数の処理が同時に走るとき

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

トランザクション分離レベルとは(全体像)

トランザクションとは、「ひとまとまりで成功か失敗かを決めたい一連の処理」のことだよー。たくさんの処理が同時に走ると、お互いの作業途中が見えてしまって、おかしなデータを読んでしまうことがあるのー。

そこで、「他人の作業途中をどれくらい見せないか」の厳しさを段階で決めるのが分離レベルだよー。

身近にたとえると、みんなで1冊の共有ノートに同時に書き込む場面。書きかけ(鉛筆の下書き)まで他人に見せてしまうとまちがいのもと。書き終わるまで見せないようにすると安全だけど、その分だけ順番待ちが増えて遅くなるのー。

押さえるのは、弱い順に4段階あることと、防ぎたい3つの異常だよー。


詳しく:4段階と3つの異常だけ覚えれば戦える

ここが記事の心臓部。まず防ぎたい「3つの異常」から見ていこーね。これは同時に処理が走るときに起きる、困った読み取りのことだよー。

防ぎたい3つの異常

異常やさしい意味
ダーティリードまだ確定していない書きかけを読んでしまう
反復不能読み取り同じものを2回読んだら値が変わっていた
ファントムリード同じ条件で読んだら行の数が増減していた

次に、その異常をどこまで防ぐかで分かれる4段階だよー。下にいくほど厳しくて安全、でも遅くなるのー。

分離レベル4段階(弱い→強い)

レベル防げる範囲
READ UNCOMMITTED一番弱い。ダーティリードも起きる
READ COMMITTEDダーティリードを防ぐ
REPEATABLE READ反復不能読み取りまで防ぐ
SERIALIZABLE一番強い。3つの異常を全部防ぐ(でも一番遅い)

ここで一番のひっかけが「どのDBMS(データベースソフト)も同じ設定で動いている」という思い込みだよー。実は標準のレベルはソフトによって違うのー。

代表的なDBMSの初期設定

DBMS標準の分離レベル
PostgreSQLREAD 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段階の強さ)

📝 オリジナル問題 1 分離レベル4段階の強さ

トランザクション分離レベルに関する次の記述のうち、正しいものはどれか。

  1. 分離レベルは、強くするほど処理の速さも一緒にどんどん速く上がっていくものなのだとされているのである
  2. 分離レベルが一番強いのはSERIALIZABLEで、3つの異常を全部防ぐが処理は遅くなりやすい
  3. 分離レベルは、READ UNCOMMITTEDが一番強くて安全なレベルだとされている
  4. 分離レベルは、画面の明るさを段階で決めるための専用の設定のことだとされているのである
データスラ
データスラ 解答・解説

解答は 2 だよー。

分離レベルで一番強いのはSERIALIZABLEで、3つの異常を全部防ぐかわりに処理は遅くなりやすいのー。強い=安全だけど遅い、というバランスだよー。

選択肢1の「強くすると速くなる」は逆で、強いほど遅くなるのー。選択肢3の「READ UNCOMMITTEDが一番強い」も誤りで、これは一番弱いレベルだよー。選択肢4の「明るさの設定」も関係ないのー。

選択肢判定理由
1強くすると遅くなる(速くならない)
2SERIALIZABLEは最強で全異常を防ぐが遅い
3READ UNCOMMITTEDは一番弱いレベル
4画面の明るさの設定ではない

オリジナル問題2(3つの異常)

📝 オリジナル問題 2 ダーティリード

分離レベルで防ぎたい異常に関する次の記述のうち、正しいものはどれか。

  1. ダーティリードとは、画面が必ず暗くなってしまうという不具合のことだとされているものである
  2. ダーティリードとは、音が必ず二重に鳴る不具合のことだとされているもの
  3. ダーティリードとは、保存した文字が必ず全部消える不具合のことだとされているもの
  4. ダーティリードとは、まだ確定していない書きかけのデータを読んでしまうことなのである
データスラ
データスラ 解答・解説

解答は 4 だよー。

ダーティリードは、まだ確定していない書きかけのデータを読んでしまうことなのー。共有ノートで、他人の鉛筆の下書きを読んでしまう感じだよー。

選択肢1の「画面が暗くなる」、選択肢2の「音が二重に鳴る」、選択肢3の「文字が消える」はどれも誤りなのー。

選択肢判定理由
1画面の不具合のことではない
2音の不具合のことではない
3文字が消える不具合のことではない
4未確定の書きかけを読んでしまうこと

オリジナル問題3(DBMSのデフォルト)

📝 オリジナル問題 3 DBMSの標準分離レベル

DBMSの標準の分離レベルに関する次の記述のうち、正しいものはどれか。

  1. PostgreSQLはREAD COMMITTED、MySQLはREPEATABLE READが標準
  2. どのデータベースソフトでも標準は必ずSERIALIZABLEで設定は同じだとされているのである
  3. PostgreSQLもMySQLも標準は必ずREAD UNCOMMITTEDで固定だとされているのである
  4. 標準の分離レベルはソフトとは全く関係なく画面の色だけで決まるものだとされているのである
データスラ
データスラ 解答・解説

解答は 1 だよー。

標準の分離レベルはソフトによって違ってPostgreSQLはREAD COMMITTED、MySQL(InnoDB)はREPEATABLE READなのー。「どれも同じ」という思い込みがひっかけだよー。

選択肢2の「どれも必ずSERIALIZABLE」、選択肢3の「どれもREAD UNCOMMITTED固定」は誤りなのー。選択肢4の「画面の色で決まる」も関係ないよー。

選択肢判定理由
1PostgreSQL=READ COMMITTED、MySQL=REPEATABLE READ
2ソフトで違い、同じではない
3READ UNCOMMITTED固定ではない
4画面の色で決まるものではない

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る