学習

トランザクションとは?意味や用法を解説【用語解説】

[line]トランザクション (英: transaction) とは、データベース管理システム(または類似のシステム)内で実行される、分けることのできない一連の情報処理の単位である。[/line]

[lineme]突然難しいこと言い出したけど、それWikipediaに書いてあることをそのまま読み上げているだけですね。[/lineme]

Wikipediaの文章は正しいのですが、エンジニアでもなければ「あ、なるほどね」と簡単に理解することは出来ないと思います。そもそもデータベース管理システムとはなにか、とかいう話をしなくては理解が進みません。

今回は難しい事抜きで、トランザクションと言う言葉の表す意味合いを簡単に解説したいと思います。

トランザクションとは

トランザクション (英: transaction) とは、データベース管理システム(または類似のシステム)内で実行される、分けることのできない一連の情報処理の単位である。

再度引用文です。大事なのは「分けることのできない」という部分です。何故「分けることができない」のでしょうか。

答えは「分けると不都合がある処理だから」です。もう少しだけ具体的に言うと、「処理の途中でエラーが発生したときにデータに矛盾が生じしてしまうから」です。

トランザクション処理の例を考える

よくある例え話ですが、Aさんの銀行口座からBさんの銀行口座へお金を振り込む処理を考えてみましょう。

① Aさんの口座からBさんの口座へ10,000円振り込み処理を実行する
② Aさんの口座から10,000円の出金を記録する
③ Bさんの口座へ10,000円の入金を記録する
④ 振り込み完了画面を表示する

簡略化してますが、こんな感じの流れになりますね。トランザクションという概念が無い状態で上記処理を行った際に、もし③の処理の途中でエラーが発生してしまったらどうなるでしょうか。②の処理は完了しているので、Aさんの口座からは10,000円がなくなっています。しかし③は完了できなかったので、Bさんの口座のお金は増えていません。

このときデータの不整合(矛盾)が生じます。こんな状況は認められません、というか一大事です。銀行みたいに特にお金に厳しいシステムでこんなことやらかしたらとんでもないことになります。

ところが、現実問題エラーは発生します。要因は様々ですが、いくら対策しても100%エラーが発生しないことはあり得ないので、エラーが発生したときの事を考える必要があります。

トランザクションとコミット・ロールバック

コミットとは
トランザクション内で行った一連の処理結果を確定させること

ロールバックとは
トランザクション内で行った一連の処理結果をなかったことにすること

先ほどの銀行の例でエラーが発生したときはロールバックする必要があります。一連の流れの中でエラーが発生したときにはロールバックをして、途中まで行った一連の流れはなかったことにする。ということです。

⓪トランザクション開始
① Aさんの口座からBさんの口座へ10,000円振り込み処理を実行する
② Aさんの口座から10,000円の出金を記録する
③ Bさんの口座へ10,000円の入金を記録する←エラー発生
※ロールバック(一連の処理をなかったことにする)
※トランザクション終了
→ エラー画面を表示する

このように、エラー発生後にロールバックすることで①の出金処理をなかったことにします。正常に処理が完了する場合は下記のようになります。

⓪トランザクション開始
① Aさんの口座からBさんの口座へ10,000円振り込み処理を実行する
② Aさんの口座から10,000円の出金を記録する
③ Bさんの口座へ10,000円の入金を記録する
※コミット(一連の処理を完了する)
※トランザクション終了
④ 振り込み完了画面を表示する

このようにトランザクションの一連の処理の最後にコミットをすることで、その処理を完了することが出来ます。

トランザクションの用法・使い道

上記の口座入出金処理のように、一連の処理の途中でエラーが発生するとデータに不整合が発生する処理ならどこでも利用できます。システムによってはすべての挿入・更新・削除処理でトランザクションを宣言してコミット・ロールバックしているかもしれません。

手動でデータをメンテナンスする際の確認方法
トランザクション開始
SELECT 更新対象 FROM 更新対象テーブル
UPDATE 更新対象テーブル SET 更新対象=”更新内容”
SELECT 更新対象 FROM 更新対象テーブル
ロールバック

手動でデータに更新処理をかけなければならない場合に、こうやって自分の書いたUPDATE文が想定通りに動作するかを試すこともあります。この方法でUPDATE文が正しい事を確認したらロールバックをコミットに変更すればOKですね。

トランザクションは非常に便利な概念ですし、意味を覚えてしまえば試験で問題になったとしても答えられるようになると思います。