トランザクション処理
このノートの問いがそのまま復習カードになり、忘れかけたころに出題されます。
シラバス案 Ver.0.1 の小分類 4-17-4「トランザクション処理」(大分類 4:デジタル技術/中分類 17:データベース)。
2026-09-26 にシラバス本文と突合済み。
0. 何を押さえるか
「途中で終わってはいけない処理」と「同時に行われる処理」を、どう矛盾なくさばくかという話です。
口座 A から B へ振り込むとき、「A から引く」と「B に足す」の片方だけが成立してはいけません。
この 2 つをまとめて 1 つの単位にしたものがトランザクションです。
トランザクションの終わり方は 2 通りしかありません。
| いつ | 結果 | |
|---|---|---|
| コミット | 全部の処理が成功した | 更新を確定する |
| ロールバック | 途中で失敗した・取り消した | 更新をなかったことにして開始前に戻す |
同時実行の側では、排他制御(ロック)と、その副作用のデッドロックが対になっています。
| 何か | |
|---|---|
| 排他制御 | 使っている間、他の処理に触らせないことで矛盾を防ぐ |
| デッドロック | 互いに相手のロックの解除を待ち合って、どちらも進めなくなる |
1. トランザクションとは
根拠: シラバス 4-17-4
トランザクションとは?
分けられない 1 つのまとまりとして扱う、一連の処理
振込なら「A から引く」と「B に足す」で 1 トランザクション。
すべて成功するか、すべてなかったことにするかのどちらかでなければならない
(中途半端な状態を残さない)。
コミットとロールバックの違いは?
| いつ行うか | 何が起きるか | |
|---|---|---|
| コミット | トランザクションの処理がすべて成功したとき | 更新を確定し、他の処理からも見えるようにする |
| ロールバック | 途中でエラーが起きた/利用者が取り消したとき | 更新をすべて取り消し、開始前の状態に戻す |
振込で「A から引いた」後に「B に足す」が失敗したら、ロールバックで A の残高も元に戻す。
確定するか、なかったことにするか。
ACID 特性の 4 つとは?
| 意味 | |
|---|---|
| 原子性(Atomicity) | 全部実行されるか、全部取り消されるか |
| 一貫性(Consistency) | 処理の前後でデータの整合性が保たれる |
| 独立性(Isolation) | 同時に実行しても、互いの途中の状態に影響されない |
| 耐久性(Durability) | コミットした結果は障害が起きても失われない |
原子性を実現するのがコミットとロールバック、
独立性を実現するのが同時実行制御(排他制御)。
2. 同時実行制御
根拠: シラバス 4-17-4
同時実行制御(排他制御)をしないと何が起きるか?
同じデータを 2 つの処理が同時に更新すると、片方の更新が消える。
在庫 10 個を、A と B が同時に読む。
A は 3 個出庫して 7 と書き、B は 2 個出庫して 8 と書く。
→ 正しくは 5 個なのに、後から書いた 8 が残る(A の更新が失われる)。
これを防ぐため、A が使っている間は B を待たせるのが排他制御。
共有ロックと専有ロックの違いは?
| 何のためにかけるか | 他の処理は | |
|---|---|---|
| 共有ロック | 読むため | 読むことはできる/更新は待たされる |
| 専有ロック(排他ロック) | 更新するため | 読むことも更新することも待たされる |
読むだけの処理どうしは同時に進めてよいので、ロックを 2 種類に分けて
待ち時間を必要な分だけに抑える。
デッドロックとは? どう起きるか?
複数の処理が互いの資源の解放を待ち合い、どちらも進めなくなる状態
- 処理 A が表 1 をロックし、表 2 を待つ
- 処理 B が表 2 をロックし、表 1 を待つ
どちらも相手が離すのを待つので、永久に進まない。
排他制御をするからこそ起きる、副作用のような現象。
デッドロックの防ぎ方と、起きてしまったときの対処は?
| 方法 | |
|---|---|
| 防ぐ | どの処理も同じ順序で資源をロックする(表 1 → 表 2 の順に統一) |
| 起きたとき | 待ち合っている処理の片方をロールバックして資源を手放させ、やり直させる |
順序が同じなら、「互いに相手の持ち物を待つ」輪ができない。
3. 障害からの回復
根拠: シラバス 4-17-4
バックワードリカバリとフォワードリカバリの違いは?
| いつ使うか | どうするか | |
|---|---|---|
| バックワードリカバリ(ロールバック) | トランザクションが途中で失敗した | 更新前の記録を使って開始前に戻す |
| フォワードリカバリ(ロールフォワード) | 記憶装置が壊れた | バックアップに、更新後の記録を反映して障害直前まで進める |
どちらもログ(更新の記録)を使う。
戻すにはログの更新前の値、進めるには更新後の値が要る。
チェックポイントとは? 何のためにあるか?
その時点までの更新内容を、記憶装置に確実に書き出す区切り
障害から回復するとき、チェックポイント以降のログだけを見ればよいので、
最初からすべてをやり直さずに済む。
回復にかかる時間を短くするための仕組み。