【とらんざくしょん】

トランザクション とは?

最終更新:
💡 「全部成功か、全部なかったことに」のひとまとめ処理

データベースの一連の操作をひとまとまりにし、まとめて確定したり取り消したりする仕組み。途中だけ更新された状態を残さないために使う。取り消せる範囲は、そのトランザクション内のDB操作だ。

📌 このページのポイント
同じDB内の残高更新をひとまとめに 口座A 残高 1,000 口座B 残高 500 1つのトランザクション ① Aから100減 ② Bへ100増 COMMIT:確定 A:900 / B:600 ROLLBACK:取消 A:1,000 / B:500
同じDBで管理する2つの残高更新の例。外部への通知や現金の排出は、この取り消しの範囲に含まれない。
ひよこ ひよこ
トランザクションって何?
ペンギン先生 ペンギン先生
たとえば口座Aから口座Bへ100を振り込むとき、Aを100減らす更新とBを100増やす更新を1つにまとめるよ。片方だけが確定すると困るので、両方をまとめて確定する単位にするんだ。
ひよこ ひよこ
途中でやめたいときは?
ペンギン先生 ペンギン先生
PostgreSQLならBEGINで始め、COMMITで確定する。確定前にROLLBACKすれば、そのトランザクションの更新を取り消せるよ。エラー後の扱いや自動コミットはDBやライブラリによるので、複数操作が同じ単位に入っているか確認しよう。
ひよこ ひよこ
コミット前の変更は誰にも見えない?
ペンギン先生 ペンギン先生
実行中のトランザクション自身は、自分が更新した内容を読むことがあるよ。他の処理から何が見えるかは分離レベルとDBの実装に依存する。PostgreSQLでは未確定の更新を他のトランザクションが読むダーティリードは起きないけれど、すべての競合が防げるわけではないんだ。
ひよこ ひよこ
ACIDならデータは必ず正しくなる?
ペンギン先生 ペンギン先生
ACIDは更新をひとまとまりにし、整合した状態を保ち、同時実行と確定後の保存を扱うための性質だよ。ただし業務上のルールは制約や処理にも実装する必要がある。分離レベルやDBの設定も確認し、競合や再試行を考えて設計しよう。
ひよこ ひよこ
メールや現金の排出も元に戻る?
ペンギン先生 ペンギン先生
DBのROLLBACKだけで、すでに送ったメールや排出した現金を取り消すことはできないよ。別サービスへの通知などをDB更新と組み合わせるなら、通知の記録をDB更新と同時に保存するoutboxなど、別の仕組みも必要になる。図は同じDB内の2つの残高更新だけを示しているんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「トランザクション」って出てきたら「全部まとめて成功か全部取り消しか、という一連の処理のことだな」と思えればだいたいOK!
📖 おまけ:英語の意味
「transaction」 = 取引・処理
💬 ビジネス用語の「取引」と同じ単語。銀行の「振込取引」がデータベースでも同じ概念で使われていると覚えよう

参考資料

← 用語集にもどる