銀行振込のように「途中で止まったら困る」処理を、安全にまとめて扱う仕組みがトランザクションです。データベースの信頼性を支えるACID特性を、身近な例で正確に押さえましょう。
トランザクションって、銀行のATMで聞いたことありますぅ〜。
難しそうな響きなのぉ。
言葉は難しそうだけど、中身はシンプルよ。
トランザクションは、ひとまとまりで扱いたい処理の束のこと。
たとえばA口座から1万円引いて、B口座に1万円足す。
この2つは必ずセットでしょう?
あー、片方だけ成功したらヤバいやつじゃん。
1万円消えるか、勝手に増えるか。
そう。
だから『両方成功、または両方なかったことにする』。
この全か無かの考え方が、これから話すACIDの出発点なのよ。
その4つの性質をまとめた言葉がACIDです。
補足すると、Atomicity・Consistency・Isolation・Durabilityの頭文字をつなげた語呂で、英語のacid(酸)と同じ綴りなので覚えやすいですね。
酸っぱいACIDね。
テストで綴りごと覚えとけば最強じゃん。
1つ目が原子性。
さっきの振込のように、これ以上分けられない一単位として扱う性質です。
原子ってそれ以上割れないってことですかぁ? だから『全部か、ゼロか』なんですねぇ。
ふふ、いい連想ね。
2つ目は一貫性。
たとえば『残高はマイナスにならない』というルールがあるなら、トランザクション後もそれが守られているの。
3つ目が独立性です。
複数の処理が並行して走っても、お互いに途中経過が見えず、1つずつ順番に実行したのと同じ結果になります。
えっ、同時に動いてるのに混ざらないってこと? どうやって分けてんの?
そこで使うのが排他制御です。
具体的にはロックをかけて、誰かが使っている間は他を待たせます。
最後の4つ目が耐久性。
一度『確定』した変更は、停電やシステム障害が起きても失われないのよ。
あの…『確定』って何で決まるんですかぁ? 途中でやめることもあるんですよねぇ?
いい質問です。
成功して変更を確定させる操作がコミット、失敗して変更をすべて取り消し、開始前の状態に戻す操作がロールバックです。
対で覚えるのがコツですね。
コミットが『決定!』で、ロールバックが『なかったことに』ね。
ところでさ、ロックって待たせ合ったまま止まったりしないの?
鋭いわね。
それがデッドロック。
お互いが相手の鍵待ちで動けなくなる状態よ。
マジか、にらみ合って一歩も動かないやつじゃん。
どうやって解決すんの?
多くの場合、データベース管理システムが自動で検出して、片方の処理を強制的にロールバックさせ、もう片方を進めます。
設計側ではロックを取る順番を揃えることで、起きにくくできます。
障害が起きたときの立て直しも大事よ。
変更の履歴を記録したログと、ある時点の状態を丸ごと保存したバックアップを組み合わせて元に戻すの。
これをリカバリというわ。
ログがあれば『どこまで進んでたか』が分かるから安心ですぅ〜。
発展として、複数のデータベースにまたがる処理では2相コミットで整合性を保ちます。
一方、NoSQLなどでは厳密さより可用性を優先するBASEという考え方もあります。
ACIDが『きっちり派』で、BASEが『まあ最終的に合えばいい派』ね。
酸と塩基で対になってるのウケる。
ふふ、その対比は覚えやすいわね。
整理すると、トランザクションは全か無かのまとまり、その品質保証がACID、確定はコミット・取消はロールバック、同時実行の交通整理が排他制御、その事故がデッドロック。
ここまで押さえれば試験は怖くないわよ。
確認クイズ
トランザクションのACID特性のうち、「処理は全て実行されるか、全く実行されないかのどちらかである」性質を表すものはどれか。
- Atomicity (原子性)
- Consistency (一貫性)
- Isolation (独立性)
- Durability (耐久性)
こたえを見る
正解: 1. Atomicity (原子性)
正解はAtomicity (原子性)。トランザクションを分割不可能な一単位とみなし、全成功か全失敗のみを認める性質です。Consistency(一貫性)は処理前後でデータの整合性が崩れないこと、Isolation(独立性)は並行する処理が互いに干渉しないこと、Durability(耐久性)はコミット後の結果が障害でも失われないことで、いずれも「全か無か」とは異なります。