- データベースにおいて複数の操作を「全て成功するか・全て失敗して元に戻るか」の一つの処理単位として扱う仕組みのこと
- 銀行の振込処理(口座Aから引き落とし→口座Bに入金)のように、途中でエラーが起きたときに中途半端な状態でデータが残らないよう保護することがトランザクションの本質だ
- トランザクションが満たすべき特性として「ACID(原子性・一貫性・分離性・耐久性)」という4つの性質があり、これを満たすことでデータベースの信頼性が保証される
【深掘り】これだけ知ってればOK!
トランザクションの中核概念がACID特性だ。Atomicity(原子性):全操作が完全に成功するか、全て取り消されるかのどちらかのみ。Consistency(一貫性):トランザクションの前後でデータの整合性が保たれる。Isolation(分離性):複数のトランザクションが同時に実行されても互いに干渉しない。Durability(耐久性):コミット後のデータはシステム障害が発生しても失われない。
トランザクションにはコミットとロールバックという2つの終了方法がある。全ての操作が成功したら「COMMIT」を実行して変更を確定させる。途中でエラーが発生したら「ROLLBACK」を実行して全ての変更を取り消して開始前の状態に戻す。この2つの操作がトランザクション管理の根幹だ。
トランザクションはパフォーマンスへの影響もある。分離性を保つためにロック(Lock)という仕組みを使い、処理中のデータを他のトランザクションが変更できないようにする。ロックが長時間続くとデータベースのパフォーマンスが低下し、最悪の場合デッドロック(相互にロックし合って処理が止まる)が発生する。トランザクションは必要な処理を最小限の範囲・最短の時間でまとめることが設計の基本だ。
よくある誤解
ROLLBACKすれば全てのデータが完全に元に戻ると思っている
ROLLBACKはデータベースの操作を元に戻せるが、アプリケーションのメモリ上の処理・外部APIへの呼び出し・メール送信などはROLLBACKでは取り消せない。トランザクション中に決済APIを呼び出して成功した後でROLLBACKしても、決済は取り消されない。外部サービスとの連携を伴う処理では補償トランザクションなどの設計が必要になる。
トランザクションはデータベースの話だけだと思っている
トランザクションの概念はデータベースに限らず使われる。メッセージキュー(Kafkaなど)の「Exactly Once(厳密に一度だけ処理する)」保証やマイクロサービスの分散トランザクション管理など、データの整合性を保つための仕組みとして幅広い文脈で登場する。
会話での使われ方

ECサイトの注文処理でエラーが起きたとき、在庫は減ってるのに注文レコードが作られないというバグが出ました。トランザクションで囲んでいなかったのが原因です。
バックエンドエンジニアがトランザクション処理の実装漏れによるデータ不整合のバグを報告している場面。




この決済処理、外部の決済APIの呼び出しをトランザクションの中に入れるのは注意が必要です。ロールバックしても決済は取り消せないので補償処理が必要になります。
テックリードがコードレビューで外部API呼び出しとDBトランザクションの組み合わせの注意点を説明している場面。




ITパスポートの試験でトランザクションのACID特性が出ました。原子性と一貫性と分離性と耐久性の4つを覚えておくと確実ですね。
IT試験の勉強中の社員が同僚にトランザクションの試験対策のポイントを共有している場面。
【まとめ】3つのポイント
- 複数のDB操作を一つの処理単位として安全に実行する仕組み:銀行振込のように複数の操作が全て成功するか全て取り消されるかのどちらかにすることで、途中のエラーによるデータの不整合を防ぐ
- ACID特性がトランザクションの信頼性を保証する4つの性質:原子性・一貫性・分離性・耐久性の4特性を満たすことで、複数ユーザーが同時アクセスする状況でもデータの整合性が守られるデータベースの信頼性の基盤となる
- トランザクションは最小範囲・最短時間でまとめるのが設計の基本:ロックによるパフォーマンス低下とデッドロックのリスクを避けるため、トランザクションに含める操作は必要最小限にして処理時間を短くすることがデータベース設計の原則だ
よくある質問
-
QSQLでトランザクションを使うにはどう書けばいいですか?
-
A
基本的な記述は「BEGIN;」または「START TRANSACTION;」でトランザクションを開始し、操作を実行後に「COMMIT;」で確定または「ROLLBACK;」で取り消しです。多くのフレームワークはORMでトランザクションを抽象化しており、直接SQLを書かなくても利用できます。
-
Qデッドロックとは何ですか?どう防げばいいですか?
-
A
デッドロックは2つのトランザクションが互いのロックを待ち合って処理が止まる状態です。防ぐには「常に同じ順序でロックを取得する」「トランザクションを短くする」「楽観的ロックを使う」などの設計が有効です。
-
Qコミットとセーブポイントの違いは何ですか?
-
A
コミットはトランザクション全体を確定させる操作です。セーブポイントはトランザクション内に中間の保存ポイントを設けて、そのポイントまでロールバックできる機能です。大きなトランザクションの中で一部だけ取り消したい場合に使います。
-
QトランザクションとロールバックはITパスポートに出ますか?
-
A
はい、頻出の重要テーマです。ACID特性の4つの意味・コミットとロールバックの違い・トランザクションが必要な理由(データ整合性の保護)が問われます。「原子性=全部成功か全部失敗か」「コミット=確定」「ロールバック=取り消し」という対応を押さえておくと確実です。
この用語と一緒に知っておきたい用語
| 用語 | この記事との関連 |
|---|---|
| データ | 本記事のテーマと実務上セットで使われることが多い用語です。コンピュータが処理する数値や文字、画像といった事実や資料そのもの、それがデータだ |
| データベース | データベースは関連分野でよく登場する重要キーワードです。データを効率よく蓄積・検索・更新・削除できるよう構造化して管理する仕組みの総称。専用エンジンを持ち大量データを高速操作できる |
| ロールバック | ロールバックを押さえると本記事の理解がさらに深まります。ロールバックというのは、システムやデータを、問題が起きる前の正常だった状態に巻き戻す操作のことなんだ。 |
| コミット | コミットは関連分野でよく登場する重要キーワードです。コミットというのは、プログラムの変更内容をここまでの作業としてまとめて記録する、バージョン管理の基本操作のことだよ。 |
| アイコン | アイコンを押さえると本記事の理解がさらに深まります。アプリやファイル、操作ボタンなどをひと目でわかる小さな絵で表したもの、それがアイコンだ |
【出典】参考URL
https://www.databricks.com/jp/blog/what-is-a-transactional-database :トランザクションデータベースとACID特性の解説(Databricks)
https://engineers.fenrir-inc.com/entry/2024/06/18/185258 :トランザクションとACID特性の詳細解説(Fenrir)
https://innovative.jp/archives/1244 :データベーストランザクションの全貌と実践ガイド


コメント