【ろーるばっく】

ロールバック とは?

最終更新:
💡 未確定のDB更新を、取り消す

DBで未確定のトランザクションを取り消し、その中の更新を戻す操作。COMMITとの違い、セーブポイント、DB外の処理やデプロイを戻す場合の限界を解説します。

📌 このページのポイント
ROLLBACK:未確定のDB更新を取消1 開始前A:100B:02 BEGIN後Aから10を引くA:90 / B:0未確定の値3 Bへの入金失敗COMMITせず取消4 ROLLBACKA:100B:0同じ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のトランザクションを中心に扱います。デプロイのロールバックも「以前の状態へ戻す」という意味で使いますが、操作と戻せる対象は別です。

参考資料

← 用語集にもどる