FIG-036

トランザクションとACID — 振込の巻き戻しボタン

データベース 2026.06.22 公開 読了 約10分

Aさんの口座からBさんへ300円を振り込む —— これは実は2つの操作でできています。「Aから300円を引く」と「Bに300円を足す」。もし1つ目だけ成功して、2つ目の直前で停電やエラーが起きたらどうなるでしょう。Aのお金は消えたのにBには届いていない、という世界に存在してはいけない状態が生まれます。

これを防ぐのがトランザクションです。複数の操作を「全部成功か、全部なかったことか」のどちらかにまとめる仕組み。下の図1で振込をステップ実行し、途中でエラーを起こしてみてください。ロールバック(巻き戻し)を押すと、何事もなかったかのように元へ戻ります。

Aさんの口座
¥1,000
→ ¥300 →
Bさんの口座
¥0
1 Aから ¥300 を引く
2 Bに ¥300 を足す
コミット(確定)
READY
「送金を実行」を押してステップを進めよう
トランザクションは BEGIN で始まり、COMMIT で確定、途中で問題が起きれば ROLLBACK で全部なかったことにできます。
図1 — 操作2の直前でエラーを起こし、ロールバックで元に戻す。合計はいつも ¥1,000

「中途半端」を絶対に残さない

図1でエラーを起こすと、Aから300円が引かれた危険な瞬間(合計¥700)が見えたはずです。ここでロールバックすると、データベースは変更をすべて取り消して元の¥1,000に戻します。逆にエラーがなければ、最後にコミットして「ここまでの変更は確定」と宣言します。コミットされるまでの変更は、いつでも丸ごと捨てられる下書きだと考えると分かりやすいです。この「全部か無か」の性質を原子性(Atomicity)と呼びます。

トランザクションが守る性質は、頭文字を取って ACID と呼ばれます。Atomicity(全部か無か)、Consistency(ルールを壊さない=残高合計が常に保たれる)、Isolation(同時に動く別の振込と混ざらない)、Durability(コミットしたら停電しても消えない)。図1で体験したのは主に原子性ですが、4つが揃って初めて「お金を扱っても安全」と言えます。

用語ミニ辞書
トランザクション
複数の操作を「全部成功か全部取消」にまとめる単位。BEGINで開始する。
コミット
トランザクション内の変更を確定させること。以後は取り消せない。
ロールバック
コミット前の変更をすべて取り消し、開始前の状態に戻すこと。
ACID
原子性・一貫性・分離性・永続性。信頼できるトランザクションの4条件。

まとめ

トランザクションは、複数の操作を「全部成功か、全部なかったことか」のどちらかに束ねる仕組みです。途中で失敗してもロールバックで開始前に戻せるので、「お金は引かれたのに届かない」ような中途半端な状態が残りません。図1でエラーありとなしの両方を実行し、合計金額が常に¥1,000のままであることを確かめてみてください。それが、お金やデータを安心して扱える土台です。