🎃

【SQL】トランザクションについてわかったことを簡単にまとめてみた

に公開

トランザクション(transaction)

データベースにおいて一連の処理をまとめて1つの単位として扱う仕組みのこと。
DBMSに対して複数のSQLを送る場合に、1つ以上のSQL文をひとかたまりとして扱うよう指示することができる(トランザクション制御 transaction control)。
これにより、処理全体が成功するか、あるいは失敗して元に戻るかのどちらかになり、データの整合性が保たれます。

Image 2025-08-21 at 9.33.jpeg
https://well-field.co.jp/services/education/web-text/sql-mysql/sql-v28 より画像引用

  • トランザクションの途中で、処理が中断されないようにします
  • トランザクションの途中に、他の人の処理が割り込めないようにします

コミットとロールバック

トランザクションの中断

振り込み処理の例
振り込み処理を実現するために必要なこと
① 振込元の口座残高を減らす
② 振込先の口座残高を増やす

ここで、①が完了したあと、異常停止によって処理が中断してしまうと、振込元の口座残高が減るだけで、振込先のお金が増えない事態になってしまう。

2つのUPDATE文を1つのトランザクションとして扱うようにDBMSに指示することで、この問題を解決することができる。

DBMSは、どんな非常時であっても、トランザクションを「一部だけが実行されることはあってはならない、途中で分割不可能なもの」として取り扱います

DBMSは、トランザクションに含まれるすべてのSQL文について、必ず「すべての実行が完了している」または「1つも実行されていない」のどちらかの状態になるように制御します。

原始性(atomicity)

トランザクションに含まれる複数のSQL文が、DBMSによって不可分なものとして扱われる性質のこと。
トランザクションは、複数のSQL文(例:UPDATEやINSERT)をひとまとめにした論理的な処理単位です。この単位を不可分(分割できない、すべて実行されるか、あるいは何も実行されないかのどちらか)として扱う性質が原子性です。

原始性確保の仕組み

コミット(commit)
トランザクション中のSQL文によってテーブルのデータが書き換えられると、それは確定ではなく仮のものとして管理されます。
そして、トランザクションが終了する際に、これらの「仮の書き換え」をすべて確定したことにする。

Image 2025-08-21 at 10.42.jpeg
https://well-field.co.jp/services/education/web-text/sql-mysql/sql-v28 より画像引用

ロールバック(rollback)
トランザクション中に異常が発生して中断した場合、DBMSはそれまで行なったすべての仮の書き換えをキャンセルして、「なかったこと」にする動作。
トランザクション内のそれまでの変更をすべて取り消し、トランザクションが開始される前の状態にデータベースを戻す処理のことを指します。

Image 2025-08-21 at 10.47.jpeg
https://well-field.co.jp/services/education/web-text/sql-mysql/sql-v28 より画像引用

SQL文のエラーで失敗したり、明示的にキャンセルが指示された場合などに行われます。
電源が落ちて突然処理が中断した場合も、再びデータベースを起動した際に自動的にロールバックが行われます。

トランザクションの指定方法

DBMSにどの範囲が1つのトランザクションであるかを伝えることで制御されます。

トランザクションを使うための指示

  • BEGIN:開始の指示
    この指示以降のSQL文を1つのトランザクションとする。

  • COMMIT:終了の指示
    この指示までを1つのトランザクションとし、変更を確定する。

  • ROLLBACK:終了の指示
    この指示までを1つのトランザクションとし、変更の取り消しをする。

(例)1月のデータをアーカイブテーブルに移動する
BEGIN;
-- 処理1: アーカイブテーブルへコピー
INSERT INTO 家計簿アーカイブ
SELECT * 
  FROM 家計簿
 WHERE 日付 <= '2024-01-31';
-- 処理2: 家計簿テーブルから削除
DELETE FROM 家計簿
 WHERE 日付 <= '2024-01-31';
COMMIT;

これにより、処理1と処理2を不可分なものとして扱います。
仮に、処理1の後に障害が発生した場合、自動的にロールバックが行われ、処理1の実行が取り消されます。

参考文献

『スッキリわかるSQL入門 第2版』

Discussion