【SQL】トランザクションについてわかったことを簡単にまとめてみた
トランザクション(transaction)
データベースにおいて一連の処理をまとめて1つの単位として扱う仕組みのこと。
DBMSに対して複数のSQLを送る場合に、1つ以上のSQL文をひとかたまりとして扱うよう指示することができる(トランザクション制御 transaction control)。
これにより、処理全体が成功するか、あるいは失敗して元に戻るかのどちらかになり、データの整合性が保たれます。
※ 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文によってテーブルのデータが書き換えられると、それは確定ではなく仮のものとして管理されます。
そして、トランザクションが終了する際に、これらの「仮の書き換え」をすべて確定したことにする。
※ https://well-field.co.jp/services/education/web-text/sql-mysql/sql-v28 より画像引用
ロールバック(rollback)
トランザクション中に異常が発生して中断した場合、DBMSはそれまで行なったすべての仮の書き換えをキャンセルして、「なかったこと」にする動作。
トランザクション内のそれまでの変更をすべて取り消し、トランザクションが開始される前の状態にデータベースを戻す処理のことを指します。
※ https://well-field.co.jp/services/education/web-text/sql-mysql/sql-v28 より画像引用
SQL文のエラーで失敗したり、明示的にキャンセルが指示された場合などに行われます。
電源が落ちて突然処理が中断した場合も、再びデータベースを起動した際に自動的にロールバックが行われます。
トランザクションの指定方法
DBMSにどの範囲が1つのトランザクションであるかを伝えることで制御されます。
トランザクションを使うための指示
-
BEGIN:開始の指示
この指示以降のSQL文を1つのトランザクションとする。 -
COMMIT:終了の指示
この指示までを1つのトランザクションとし、変更を確定する。 -
ROLLBACK:終了の指示
この指示までを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