頻出中 ⏱ 7分★★★☆☆

トランザクション基礎

BEGIN/COMMIT/ROLLBACK・ACID・SAVEPOINT を完全習得

データベースに対する一連の操作を1つの論理的な作業単位としてまとめたもの。全ての操作が成功すればコミット(確定)、1つでも失敗すればロールバック(取り消し)する。

銀行振込の例:「A口座から引き出す」「B口座に入金する」の2操作は必ず両方成功か両方失敗でなければならない。
-- トランザクション開始
BEGIN;   -- または START TRANSACTION;

-- データ操作
UPDATE 口座 SET 残高 = 残高 - 10000 WHERE 口座ID = 'A';
UPDATE 口座 SET 残高 = 残高 + 10000 WHERE 口座ID = 'B';

-- 成功時:コミット(確定)
COMMIT;

-- 失敗時:ロールバック(取り消し)
ROLLBACK;
特性英語意味保証手段
原子性Atomicity全て成功か全て失敗のどちらかUNDO ログ(ロールバック)
一貫性Consistency制約・整合性を常に満たす制約チェック、トリガー
独立性Isolation他TXの途中結果が見えないロック、MVCC
永続性Durabilityコミット後は障害でもデータが失われないREDO ログ(WAL)
ACID の詳細は「ACID特性」ページを参照。ここではトランザクション操作との対応関係を押さえる。
オートコミットON(デフォルト)明示的トランザクション
コミットタイミング各SQL文実行直後に自動コミットCOMMIT 実行時
ロールバック不可(既にコミット済み)ROLLBACK で可能
複数操作の原子性保証されない保証される
用途参照系・単純な1操作複数テーブルへの関連更新
-- オートコミットを無効にする(MySQL例)
SET autocommit = 0;
-- 以降のSQL文は明示的なCOMMITまで確定しない
BEGIN;
INSERT INTO 受注 VALUES (1001, '2024-01-01');

SAVEPOINT sp1;  -- セーブポイントを設置

INSERT INTO 受注明細 VALUES (1001, '商品A', 3);
-- ここでエラーが発生した場合

ROLLBACK TO SAVEPOINT sp1;  -- sp1以降だけ取り消す
-- 受注への INSERT は残ったまま

INSERT INTO 受注明細 VALUES (1001, '商品B', 1);  -- 再試行
COMMIT;
SAVEPOINT でトランザクション全体をロールバックせずに特定の操作だけを取り消せる。大量操作の途中エラー処理に使う。

📝 理解度チェック

オートコミットがONの状態で複数テーブルを更新するとき、最もリスクがある問題はどれか?
SAVEPOINTの主な用途はどれか?
ACID特性の「永続性(Durability)」を保証する主な手段はどれか?

読了ボタンを누すとトップページの進捉に反柼されます