SQLトランザクション制御とは(全体像)
トランザクションは、いくつかの操作を1つのまとまりにして、「全部成功」か「全部なかったこと」のどちらかにするしくみ。中途半端な状態を残さないのがねらいだよー。
身近にたとえると、銀行振込。「Aさんの口座から引く」と「Bさんの口座に足す」は、両方そろって初めて意味がある。片方だけ成功してお金が消えたら困るよね。だから2つを1まとまりにして扱うのー。
押さえるのは、まとまりを確定するのがCOMMIT、取り消すのがROLLBACKということ。ここが試験でいちばん問われるよー。
詳しく:COMMIT・ROLLBACKとモードだけ覚えれば戦える
ここが記事の心臓部。まず操作の命令を見ていこーね。
トランザクションの主な命令
| 命令 | はたらき |
|---|---|
| BEGIN(開始) | ここからひとまとまりにする、と宣言 |
| COMMIT | まとまりを確定して保存する |
| ROLLBACK | まとまりを取り消してなかったことにする |
| SAVEPOINT | 途中に「ここまで戻れる」目印を置く |
ここで一番のひっかけが「ROLLBACKは保存済みのデータも消せる」という誤解。ROLLBACKで取り消せるのは、まだCOMMIT(確定)していない変更だけ。いったんCOMMITした内容は、ROLLBACKでは戻せないよー。
もう1つの要点が、確定のしかた(モード)。
確定のモード
| モード | 動き |
|---|---|
| 自動コミット | 1つの文ごとに自動で確定(MySQLなどの初期設定) |
| 明示モード | BEGINからCOMMITまでを自分でまとめる |
ここで2つめのひっかけが「どのデータベースでも自動で確定される」という思い込み。確定のしかたはデータベース製品によって違う(自動が初期のものもあれば、自分でCOMMITするものもある)ので、同じだと決めつけないのが大事だよー。
わかりやすく言い換えると
要するに、銀行振込でイメージするとラクだよー。
①トランザクション … 「引き落とし」と「入金」を1まとまりにして、全部やるか全部やめるか
②COMMIT … 両方うまくいったので確定して保存する
③ROLLBACK … 途中で失敗したので、まとめてなかったことにする(確定前だけ戻せる)
つまり、「COMMITは確定・ROLLBACKは取り消し」「戻せるのは確定前だけ」、この2点が試験の急所なのー。
試験のツボ
🔴 一番出る:COMMITとROLLBACK
①COMMITはまとまりを確定して保存する
②ROLLBACKはまとまりを取り消してなかったことにする
🔴 次に出る:ROLLBACKで戻せる範囲
①ROLLBACKで取り消せるのは、まだCOMMITしていない変更だけ
②いったんCOMMITした内容はROLLBACKでは戻せない
🟡 押さえると安定:確定のモードとSAVEPOINT
①自動コミットと明示モードがあり、データベース製品で初期設定が違う
②SAVEPOINTは途中に「ここまで戻れる」目印を置くしくみ
よくある間違い
①「ROLLBACKは確定済み(COMMIT済み)のデータも取り消せる」→ ✗ ROLLBACKで戻せるのは、まだCOMMITしていない変更だけ。
②「どのデータベースでも必ず自動で確定される」→ ✗ 確定のしかたは製品で違う。自分でCOMMITするものもある。
③「COMMITとROLLBACKは同じ意味である」→ ✗ COMMITは確定して保存、ROLLBACKは取り消し。逆の働き。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(COMMITとROLLBACK)
トランザクションの命令に関する次の記述のうち、正しいものはどれか。
- COMMITもROLLBACKも、どちらもデータを必ず完全に削除する命令だとされているものである
- COMMITはまとまりを確定して保存し、ROLLBACKはまとまりを取り消してなかったことにする
- COMMITは画面を明るくし、ROLLBACKは画面を暗くする命令のことだとされているものである
- COMMITとROLLBACKはまったく同じ意味で、どちらも取り消しを行うものだとされている
解答は 2 だよー。
COMMITはまとまりを確定して保存、ROLLBACKはまとまりを取り消してなかったことにする命令なのー。銀行振込で両方そろったらCOMMIT、ダメならROLLBACKだよー。
選択肢1の「必ず完全に削除」、選択肢3の「画面の明暗」、選択肢4の「同じ意味」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 削除する命令ではない |
| 2 | ✓ | 確定がCOMMIT・取り消しがROLLBACK |
| 3 | ✗ | 画面の明暗ではない |
| 4 | ✗ | 逆の働きで同じではない |
オリジナル問題2(ROLLBACKで戻せる範囲)
ROLLBACKに関する次の記述のうち、正しいものはどれか。
- ROLLBACKは確定済み(COMMIT済み)のデータも自由に取り消せるものだとされているものだ
- ROLLBACKはデータベースを完全に初期状態へ戻す命令のことだとされているものである
- ROLLBACKで取り消せるのは、まだCOMMITしていない変更だけで、確定済みは戻せない
- ROLLBACKは画面の表示を1つ前に戻すだけの機能のことだとされているものである
解答は 3 だよー。
ROLLBACKで取り消せるのは、まだCOMMIT(確定)していない変更だけなのー。いったんCOMMITした内容は、ROLLBACKでは戻せないよー。
選択肢1の「確定済みも取り消せる」、選択肢2の「完全に初期状態へ」、選択肢4の「画面を1つ前に戻す」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 確定済みは戻せない |
| 2 | ✗ | 初期状態へ戻す命令ではない |
| 3 | ✓ | 確定前の変更だけ取り消せる |
| 4 | ✗ | 画面の表示を戻す機能ではない |
オリジナル問題3(確定のモード)
確定(コミット)のモードに関する次の記述のうち、正しいものはどれか。
- 自動コミットと明示モードがあり、確定のしかたはデータベース製品によって違うことがある
- どのデータベースでも必ず自動で確定され、製品による違いはまったくないものだとされている
- 確定のしかたは画面の色で決まるもので、データベースとは無関係だとされているものである
- 確定はいつも手作業だけで行い、自動で確定される方式は存在しないものだとされている
解答は 1 だよー。
確定のしかたには、自動コミット(1文ごとに自動で確定)と明示モード(BEGINからCOMMITまで自分でまとめる)があって、データベース製品によって初期設定が違うのー。同じだと決めつけないのがポイントだよー。
選択肢2の「必ず自動・違いはない」、選択肢3の「画面の色で決まる」、選択肢4の「自動は存在しない」はどれも誤りなのー。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 自動と明示があり製品で違う |
| 2 | ✗ | 製品で違いがある |
| 3 | ✗ | 画面の色では決まらない |
| 4 | ✗ | 自動コミットは存在する |
まとめ
押さえどころ
- 🔴 COMMITとROLLBACK = COMMITは確定して保存、ROLLBACKは取り消してなかったことにする。
- 🔴 ROLLBACKで戻せる範囲 = まだCOMMITしていない変更だけ。確定済みは戻せない。
- 🟡 確定のモードとSAVEPOINT = 自動コミットと明示モードがあり製品で違う。SAVEPOINTは途中に戻れる目印。
次に学ぶ
執筆: SikakuQuest編集部