頻出高 ⏱ 6分★★★★★

コミットとロールバック

SAVEPOINT・WAL・2PCまで完全網羅

トランザクションの変更を永続化(確定)する命令。COMMIT 後は ROLLBACK で取り消せない。ACID の「D(耐久性)」を保証する。

BEGIN TRANSACTION;
UPDATE 在庫 SET 数量 = 数量 - 1 WHERE 商品ID = 'P01';
INSERT INTO 受注 (商品ID, 数量) VALUES ('P01', 1);
COMMIT;   -- ここで永続化。REDO ログが先に書かれている

トランザクション開始以降の変更を全て取り消す命令。UNDO ログを使って元の状態に戻す。ACID の「A(原子性)」を保証する。

BEGIN TRANSACTION;
UPDATE 在庫 SET 数量 = 数量 - 1 WHERE 商品ID = 'P01';
-- 在庫不足を検知してキャンセル
ROLLBACK;  -- 在庫の変更が UNDO ログで取り消される
BEGIN TRANSACTION;

UPDATE テーブルA ...;        -- ステップ 1
SAVEPOINT sp1;               -- 中間チェックポイントを設定

UPDATE テーブルB ...;        -- ステップ 2
-- ステップ 2 でエラー発生
ROLLBACK TO SAVEPOINT sp1;  -- ステップ 2 だけ取り消し

COMMIT;                      -- ステップ 1 は確定
SAVEPOINT を使うとトランザクション内の中間状態に戻れる。全体ロールバックではなく部分的な再試行が可能。
① COMMIT 命令を受け取る
② REDO ログ(変更内容)をディスクに書き込み(fsync で確実に)
③ コミットレコードをログに追記
④ コミット成功を応答(データページはバックグラウンドで遅延書き込み)
WAL(Write Ahead Log)= 「データより先にログを書く」原則。ログさえ残っていれば障害後の復旧が可能(耐久性の基盤)。
autocommit モードの違い
設定動作ROLLBACK
autocommit=ON(デフォルト)各 SQL 文が即座にコミットされる❌ できない
autocommit=OFF / BEGIN 使用明示的にコミットするまで保留✅ できる
-- MySQL / PostgreSQL での明示的トランザクション
START TRANSACTION;   -- autocommit を一時的に無効化
UPDATE ...;
COMMIT;              -- または ROLLBACK

複数のデータベースにまたがるトランザクションを整合性を保ちながら確定するプロトコル。

フェーズ 1(投票):コーディネーターが全参加者に「コミット準備できるか?」を問い合わせ
↓ 全員 YES
フェーズ 2(決定):コーディネーターが全参加者に「コミットせよ」を指示

1 人でも NO を返したらコーディネーターは全員に ROLLBACK を指示。

📝 理解度チェック

SAVEPOINT の目的として正しいのはどれか?
WAL(Write Ahead Logging)の「Ahead」の意味はどれか?
2 フェーズコミット(2PC)の目的はどれか?

読了ボタンを押すとトップページの進捗に反映されます