ひとことで言うと
トランザクションは、複数の処理をひとつのまとまりとして扱い、すべて成功(コミット)するか、すべて元に戻す(ロールバック)かのどちらかを保証する仕組みです。
「途中までしか処理されない」という状態を防ぐことで、データの一貫性を守ります。 データベースの操作で欠かせない概念で、基本情報技術者試験でも必ずといっていいほど出題されます。
たとえ話でもう少し詳しく
トランザクションは、銀行の振込に近いです。
- Aさんの口座から1万円を引き落とす
- Bさんの口座に1万円を入金する
この2つはセットです。 引き落としだけ起きてBさんへの入金が失敗したら、1万円がどこにも存在しなくなります。 逆にAさんからの引き落とし前にBさんへの入金が確定したら、お金が増えてしまいます。
トランザクションは「2つとも成功したら確定、1つでも失敗したら両方なかったことにする」を保証します。
ACID特性
トランザクションには4つの性質(ACID)が定義されています。
| 性質 | 意味 |
|---|---|
| Atomicity(原子性) | すべて完了するかすべて取り消されるかのどちらか |
| Consistency(一貫性) | 処理の前後でデータが整合した状態を保つ |
| Isolation(独立性) | 同時に複数の処理が走っても互いに干渉しない |
| Durability(永続性) | 完了した処理の結果は、障害が起きても消えない |
基本情報ではこの4つの頭文字「ACID」がよく問われます。
よく出る場面・使いどころ
- ECサイトの注文処理(在庫を減らして・注文を記録して・決済を確定する)
- 銀行・送金サービスでの入出金
- 予約システムで「空席確認」と「席の確保」を同時に行うとき
- 複数テーブルにまたがるデータ更新を一括で扱うとき
似た言葉との違い
- マイグレーション
- データベースの構造変更を管理する仕組み
- マイグレーションもトランザクション的に「適用するか戻すか」を管理する
- バックアップ
- データを別の場所に保存しておく仕組み
- トランザクションが失敗しても自動でロールバックされるが、障害でデータが壊れた場合の復旧はバックアップが必要
- ロールバック
- 変更を元の状態に戻す作業
- トランザクションにおいては処理失敗時に自動的に行われる
実務で気にするポイント
- トランザクションの範囲を広げすぎると、ロックがかかって他の処理が待たされる
- 長時間のトランザクションはデータベースの性能問題の原因になりやすい
- 「どこまでをひとつのトランザクションにするか」の設計はシステムの信頼性を左右する
- エラー時のロールバック処理をアプリ側でも明示的に書く習慣を持つ
注意: トランザクションを使えば万全というわけではありません。トランザクション範囲の設計が不適切だと、デッドロック(複数の処理が互いに相手の完了を待ち続ける状態)が発生することがあります。