定義
ロールバック(Rollback)とは、データベースやソフトウェアシステムにおいて処理の途中でエラーが発生したり処理を取り消す必要が生じた際に、その一連の処理(トランザクション)を開始する前の正常な状態へとデータを巻き戻す復旧技術のことです。誤った変更を取り消し、システムの安定性を守る重要な安全装置といえます。
なぜ「巻き戻す技術」が絶対に必要なのでしょうか?
スマートフォンの銀行アプリで友人に送金する場面を思い浮かべてみてください。自分の口座からお金が引き落とされた直後、銀行の電算システムに突然の停電や障害が発生したとします。友人の口座にはまだ入金されていないのに、システムがそのまま停止してしまったらどうなるでしょうか? 自分の口座から消えたお金は宙に浮き、お互いの残高の辻褄が合わなくなってしまいます。
コンピュータの世界では、このように複数の段階が連動する処理が中途半端に途切れてしまうと致命的な事故につながります。すべてのステップが完璧に完了しないのであれば、いっそのこと最初から何も手を付けない状態にしておくほうがはるかに安全なのです。
そこで処理の途中でエラーが検知されたり処理を中止せざるを得ない場合、システムはロールバックを実行して作業をストップします。そして、口座からお金が引き落とされる前の状態へと時間を巻き戻すようにデータを復元します。このようにデータの整合性が崩れないよう、一連の処理全体を「なかったこと」にして元に戻す技術がまさにロールバックです。
どうやって元の状態へ正確に戻すのでしょうか?
童話の『ヘンゼルとグレーテル』で、帰り道を見失わないよう森の中に小石を落としていく場面を覚えている方も多いでしょう。トランザクションに対応したデータベースなどのシステムも、データを書き換える前に小石のような綿密な足跡を残しています。この記録帳を「ログ(Log)」と呼びます。なお、システム全体を特定の一時点のまま保存しておく「スナップショット」はこれとは異なる別の仕組みで、主にサーバーやデプロイの復旧に用いられます。
データベースは値を1つ変更するたびに、実際に書き換える直前の元の値をまずログに書き留めます。もし3段階の処理のうち2段階目で予期せぬエラーが発生した場合、システムはこの記録帳を開いて、先ほど変更した内容を逆順に1つずつ取り消していきます。
そのおかげで、複雑な計算を処理している最中に突然電源が落ちたりネットワークが切断されたりしても慌てる必要はありません。システムが再起動した際、あらかじめ保存しておいた変更前の記録を読み込み、最後まで完了しなかった処理を取り消して、完了が確定した処理だけが残る一貫した状態へと復元してくれるからです。
もう少し正確に言うと:トランザクションとデプロイ
もう少し詳しく見ると、ロールバックは主に「データベースのトランザクション」と「プログラムのリリース(デプロイ)」という2つの領域で最も重要な役割を果たします。データベースでは、これ以上分割できないひとまとまりの処理単位を「トランザクション」と呼びます。ここでは、「すべて成功するか、まったく実行されないかのどちらかでなければならない」という原子性(All or Nothing)の原則を守るために、ロールバックが不可欠となります。
一方、Webサービスやスマホアプリを運用する開発現場でも、ロールバックは日常的に活躍しています。開発チームが魅力的な新機能を盛り込んだ最新バージョンのプログラムをサーバーにデプロイした直後、急にアプリが強制終了したり決済ができなくなったりする深刻なトラブルが発生することがあります。
エラーの原因を突き止めてコードを修正し、再リリースするには何時間も、あるいは何日もかかる場合があります。そこで運用チームは直ちに「デプロイのロールバック」を実行し、先ほど公開したバージョンを取り消して直前の安定したバージョンへと巻き戻します。ロールバックはユーザーへの影響を最小限に抑え、サービスの停止を防ぐ最後の盾としての役割を果たしているのです。
よくある誤解
ロールバックを実行すれば、バグやエラーの原因が自動的に修正される。
ロールバックは問題を直してくれる技術ではなく、トラブルが起きる前の安全な状態にシステムを「巻き戻す」応急処置です。エラーを引き起こした根本的な原因は、開発者が別途調査してプログラムを修正しなければなりません。
日常で出会う場面
モバイルゲームの大型アップデート後に接続障害が発生した際、緊急メンテナンスを行ってアップデート直前のバージョンへ巻き戻すケースです。
ネット通販の注文処理中に在庫の引き落としは完了したものの、注文履歴の保存でエラーが発生したため、在庫の引き落としも連動して取り消され、注文前の状態に戻るケースです。
つまり ひとことで
ロールバックとは、システムの処理中やデプロイ時に障害が発生した際、処理前の安全な状態へと巻き戻してくれる復旧技術です。