トランザクションとACID — 振込の巻き戻しボタン
Aさんの口座からBさんへ300円を振り込む —— これは実は2つの操作でできています。「Aから300円を引く」と「Bに300円を足す」。もし1つ目だけ成功して、2つ目の直前で停電やエラーが起きたらどうなるでしょう。Aのお金は消えたのにBには届いていない、という世界に存在してはいけない状態が生まれます。
これを防ぐのがトランザクションです。複数の操作を「全部成功か、全部なかったことか」のどちらかにまとめる仕組み。下の図1で振込をステップ実行し、途中でエラーを起こしてみてください。ロールバック(巻き戻し)を押すと、何事もなかったかのように元へ戻ります。
「中途半端」を絶対に残さない
図1でエラーを起こすと、Aから300円が引かれた危険な瞬間(合計¥700)が見えたはずです。ここでロールバックすると、データベースは変更をすべて取り消して元の¥1,000に戻します。逆にエラーがなければ、最後にコミットして「ここまでの変更は確定」と宣言します。コミットされるまでの変更は、いつでも丸ごと捨てられる下書きだと考えると分かりやすいです。この「全部か無か」の性質を原子性(Atomicity)と呼びます。
トランザクションが守る性質は、頭文字を取って ACID と呼ばれます。Atomicity(全部か無か)、Consistency(ルールを壊さない=残高合計が常に保たれる)、Isolation(同時に動く別の振込と混ざらない)、Durability(コミットしたら停電しても消えない)。図1で体験したのは主に原子性ですが、4つが揃って初めて「お金を扱っても安全」と言えます。
- トランザクション
- 複数の操作を「全部成功か全部取消」にまとめる単位。BEGINで開始する。
- コミット
- トランザクション内の変更を確定させること。以後は取り消せない。
- ロールバック
- コミット前の変更をすべて取り消し、開始前の状態に戻すこと。
- ACID
- 原子性・一貫性・分離性・永続性。信頼できるトランザクションの4条件。
まとめ
トランザクションは、複数の操作を「全部成功か、全部なかったことか」のどちらかに束ねる仕組みです。途中で失敗してもロールバックで開始前に戻せるので、「お金は引かれたのに届かない」ような中途半端な状態が残りません。図1でエラーありとなしの両方を実行し、合計金額が常に¥1,000のままであることを確かめてみてください。それが、お金やデータを安心して扱える土台です。