【ろーるばっく】
ロールバック とは?
最終更新:
💡 未確定のDB更新を、取り消す
DBで未確定のトランザクションを取り消し、その中の更新を戻す操作。COMMITとの違い、セーブポイント、DB外の処理やデプロイを戻す場合の限界を解説します。
📌 このページのポイント
ロールバックは、何を戻すの?
DBで未確定のトランザクションを取り消し、その中の更新を戻す操作だ。図は同じDB内の架空の口座A・Bで、出金後に入金できなかったため、出金も取り消す例だよ。
COMMITとは、どう違うの?
COMMITは更新を確定し、ROLLBACKは未確定の更新を取り消す。COMMIT済みの更新を、そのトランザクションのROLLBACKで後から戻すことはできない。エラー時に何が自動で取り消されるかはDBや状況による。
途中までの処理だけ、戻せる?
セーブポイントを使えるDBでは、その位置以降の処理だけを取り消す方法がある。PostgreSQLにはROLLBACK TO SAVEPOINTがある。全部取り消すROLLBACKとは、対象の範囲が違うよ。
トランザクション中のメール送信も、戻る?
送信済みメールなどDBの外の処理は、DBのROLLBACKだけでは戻らない。図のような例も、対象の更新を同じトランザクションで扱うことが前提だ。システム全体が自動で過去の状態へ戻るわけではない。
前のアプリへ戻すデプロイも、同じ操作?
別の操作だよ。前のバージョンへ戻しても、DBの変更まで自動で戻るとは限らない。DBの構造を戻すマイグレーションも、戻す手順や失われるデータを確認する必要がある。
もっと詳しく知りたい人へ
テーブルや列の変更も、必ず取り消せる?
DBと操作によります。例えばMySQL 8.4では、多くのDDLが実行前などに暗黙のCOMMITを起こします。TEMPORARYの例外にも、ROLLBACKで取り消せない操作があります。列の削除はどのDBでも絶対に戻せない、逆にBEGINさえあれば何でも戻せる、と一般化しません。
COMMIT後の誤更新を直したいときは?
通常のROLLBACKとは別に、修正用の更新や、バックアップ等を使う復旧を検討します。確定後には別の更新も起こり得るため、単純に逆の操作をすれば正しく戻るとは限りません。対象のデータ、影響範囲、利用できる復旧手段を確認します。
まとめ:ざっくりこれだけ覚えればOK!
「ロールバック」って出てきたら「未確定のトランザクションを取り消し、その中のDB更新を戻す操作」と思えばだいたいOK!
📖 おまけ:英語の意味
「Rollback」 = 巻き戻す
💬 このページではDBのトランザクションを中心に扱います。デプロイのロールバックも「以前の状態へ戻す」という意味で使いますが、操作と戻せる対象は別です。