BEGIN/COMMIT/ROLLBACK・ACID・SAVEPOINT を完全習得
データベースに対する一連の操作を1つの論理的な作業単位としてまとめたもの。全ての操作が成功すればコミット(確定)、1つでも失敗すればロールバック(取り消し)する。
-- トランザクション開始 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) |
| オートコミット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;
読了ボタンを누すとトップページの進捉に反柼されます