並行制御とは(全体像)
並行制御は、何人もが同時に同じデータを読み書きしても、結果がおかしくならないように調整するしくみだよー。
身近にたとえると、1冊の共有ノートを何人かで同時に編集する感じ。同じページを2人が一度に書き換えると、内容が壊れちゃう。それを防ぐのが並行制御なのー。
押さえるのは、2PL(鍵で守る慎重派)とMVCC(コピーを持つ楽観派)の違いと、デッドロックの対処だよー。
詳しく:2PLとMVCCの違いとデッドロックだけ覚えれば戦える
ここが記事の心臓部。まず2つの考え方を見ていこーね。
2PLとMVCC
| 方式 | 考え方 | 代表 |
|---|---|---|
| 2PL(悲観的) | 鍵(ロック)を取ってから使い、終わったら返す | MySQL InnoDB |
| MVCC(楽観的) | コピー(バージョン)を持ち、読みと書きをぶつけない | PostgreSQL・Oracle |
2PLは、使う前に鍵(ロック)をかけて、他の人を待たせる慎重なやり方。MVCCは、データのコピー(バージョン)を持つことで、読んでいる人と書いている人がぶつからないようにするやり方だよー。
ここで一番のひっかけが「MVCCはロックがまったく要らない」という誤解。読み書きはぶつけずに済むけれど、書き込みどうしがぶつかるときはロックが必要。完全にロックなし、ではないよー。
もう1つの要点がデッドロック。
デッドロック
| 項目 | 内容 |
|---|---|
| 何が起きる | おたがいが相手の鍵を待ち、永遠に止まる |
| 対処 | 検出して、片方を強制終了(犠牲者)して解く |
デッドロックは、AさんとBさんが「あなたの鍵を待つ」「いやあなたの鍵を待つ」と譲り合って、両方止まってしまう状態。データベースはこれを検出して、片方を強制終了して解決するのー。
なお、ここで2つめのひっかけが「2PLは必ずデッドロックになる」という思い込み。設計しだいで避けられるので、必ず起きるわけではないよー。
わかりやすく言い換えると
要するに、共有ノートの編集でイメージするとラクだよー。
①2PL … 書く前に「このページ使用中」の鍵をかける(慎重派)
②MVCC … ページのコピーを配って、読む人と書く人がぶつからないようにする(楽観派)
③デッドロック … 2人が「お先にどうぞ」と譲り合って、両方止まってしまう
つまり、「2PLは鍵・MVCCはコピー」「デッドロックは検出して片方を止める」、この2点が試験の急所なのー。
試験のツボ
🔴 一番出る:2PLとMVCCの違い
①2PLは鍵(ロック)を取ってから使う悲観的なやり方(MySQL InnoDB)
②MVCCはコピー(バージョン)を持ち読み書きをぶつけない楽観的なやり方(PostgreSQL・Oracle)
🔴 次に出る:MVCCの注意点
①読みと書きはぶつけずに済む
②書き込みどうしがぶつかるときはロックが必要(完全にロックなしではない)
🟡 押さえると安定:デッドロック
①おたがいが相手の鍵を待ち、両方が永遠に止まる状態
②検出して片方を強制終了(犠牲者)して解決する
よくある間違い
①「MVCCはロックがまったく要らない」→ ✗ 読み書きはぶつけずに済むが、書き込みどうしの競合ではロックが必要。
②「2PLは必ずデッドロックになる」→ ✗ 設計しだいで避けられる。必ず起きるわけではない。
③「並行制御は同時に動く処理を1つに減らすことである」→ ✗ 同時に動かしたまま、結果がおかしくならないように調整するしくみ。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(2PLとMVCC)
2PLとMVCCに関する次の記述のうち、正しいものはどれか。
- 2PLもMVCCも画面の明るさをこまかく決めるための設定のことだとされているものである
- 2PLとMVCCはまったく同じしくみで、考え方にもいっさい違いはないものだとされているものだ
- 2PLは鍵(ロック)を取ってから使い、MVCCはコピー(バージョン)でぶつけない方式である
- 2PLはデータを必ず暗号化する命令で、MVCCは削除する命令だとされているものである
解答は 3 だよー。
2PLは鍵(ロック)を取ってから使うやり方、MVCCはコピー(バージョン)を持って読み書きをぶつけないやり方なのー。慎重派の2PL、楽観派のMVCC、というイメージだよー。
選択肢1の「明るさの設定」、選択肢2の「まったく同じ」、選択肢4の「暗号化・削除」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 明るさの設定ではない |
| 2 | ✗ | 考え方が違う |
| 3 | ✓ | 2PLは鍵・MVCCはコピー |
| 4 | ✗ | 暗号化や削除の命令ではない |
オリジナル問題2(MVCCの注意点)
MVCCに関する次の記述のうち、正しいものはどれか。
- MVCCは画面に複数の窓を表示するための機能のことだとされているものである
- MVCCはどんなときもロックがいっさい要らず、書き込み競合でも不要なものだとされている
- MVCCはデータを必ず削除するための命令のことだとされているものである
- MVCCは読み書きをぶつけずに済むが、書き込みどうしの競合ではロックが必要である
解答は 4 だよー。
MVCCは読みと書きをぶつけずに済むけれど、書き込みどうしがぶつかるときはロックが必要なのー。完全にロックなし、ではないんだよー。
選択肢1の「複数の窓」、選択肢2の「いっさい要らない」、選択肢3の「削除する命令」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 窓を表示する機能ではない |
| 2 | ✗ | 書き込み競合ではロックが要る |
| 3 | ✗ | 削除する命令ではない |
| 4 | ✓ | 読み書きはぶつけず・書込競合は必要 |
オリジナル問題3(デッドロック)
デッドロックに関する次の記述のうち、正しいものはどれか。
- デッドロックはおたがいが相手の鍵を待って両方が止まる状態で、検出して片方を強制終了する
- デッドロックは処理がいつもよりずっと速くなる便利な状態のことだとされているものなのである
- デッドロックは画面が必ず暗くなってしまう困った現象のことだとされているものである
- デッドロックはデータを必ず暗号化して隠すための命令のことだとされているものである
解答は 1 だよー。
デッドロックは、おたがいが相手の鍵を待って、両方が永遠に止まってしまう状態なのー。データベースはこれを検出して、片方を強制終了(犠牲者)して解くんだよー。
選択肢2の「速くなる」、選択肢3の「画面が暗くなる」、選択肢4の「暗号化する命令」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 相手の鍵待ちで止まる・検出して解く |
| 2 | ✗ | 速くならず止まる |
| 3 | ✗ | 画面が暗くなる現象ではない |
| 4 | ✗ | 暗号化の命令ではない |
まとめ
押さえどころ
- 🔴 2PLとMVCCの違い = 2PLは鍵(ロック)で守る悲観的、MVCCはコピー(バージョン)でぶつけない楽観的。
- 🔴 MVCCの注意点 = 読み書きはぶつけずに済むが、書き込みどうしの競合ではロックが必要。
- 🟡 デッドロック = おたがいの鍵待ちで両方止まる。検出して片方を強制終了して解決する。
次に学ぶ
- トランザクションACID ── 信頼の4つの約束。並行制御はI(独立性)を支えるしくみ。
- SQLトランザクション制御 ── COMMITやROLLBACKの命令。並行する処理の確定・取り消し。
執筆: SikakuQuest編集部