トランザクションとは
一連のデータ操作をまとめた論理的な処理単位。
ざっくり言うとUPDATEとかINSERTした後に、コミット(※1)もしくはロールバック(※2)するまでの処理を1トランザクションと考える。
※1 コミット:全ての操作を確定させる。
※2 ロールバック:全ての操作を取り消す。
もしトランザクションの概念がない場合、以下のような事象が起こった場合にデータの不整合が発生する。
例:AさんからBさんの口座へ5万円の振替処理を行う
①Aさんの口座残高から5万円をマイナスする。
②Bさんの口座残高に5万円をプラスする予定だったが、障害により処理が失敗した。
①、②のそれぞれの処理を1つのトランザクションで管理していない場合はAさんの口座から5万円差し引かれた状態になるのでデータとして不整合が生じる。
しかし、1トランザクションとして管理していた場合、ロールバックすることで①の処理も取り消すことができるので、データの整合性を担保することができる。
トランザクションの開始と終了
【開始】
サーバーに接続後、または直前のトランザクションが終了後、「最初のDML(※)文がじっこうされたとき」に自動的にトランザクションが開始される。
※DML:データ操作言語。SELECT、INSERT、UPDATE、DELETEなど。トランザクションは1つ、または複数のDML文で構成される。
【終了】
以下のイベントが発生した場合、終了する。
- COMMIT文、ROLLBACK文の実行時
- DDL、もしくはDCL文の実行時(自動コミット)
- ユーザーによってSQL実行ツールが正常終了した場合(自動コミット)
- ユーザーによってSQL実行ツールが異常終了した場合(自動ロールバック)
- マシン障害やシステムクラッシュが発生した場合(自動ロールバック)
その他のトランザクション制御処理
トランザクション制御文にはCOMMIT、ROLLBACK以外に「SAVEPOINT」がある。
SAVEPOINT文を実行することにより、トランザクションを継続したまま指定したセーブポイントまでロールバックすることができる。
- SAVEPOINT セーブポイント名
⇨セーブポイントを作成する。トランザクションは継続したまま。 - ROLLBACK TO セーブポイント名
⇨指定したセーブポイントまでロールバックする。複数のセーブポイントを設定した場合、指定したセーブポイント以降のセーブポイントは自動的に破棄される。