keyword 10 トランザクション
トランザクションというキーワードは、データベースのデータの値を更新する上で、大変重要なキーワードとなります注。ここで説明するトランザクションとは、関連する複数のデータの修正などの処理を、1つの処理単位としてまとめたものです。データの修正をDML文によって行なった場合、それは仮修正となり、処理単位で最後にすべて適用するのか(COMMIT)、取り消すのか(ROLLBACK)を決定させる仕組みを持ちます。
では、なぜこのような仕組みが必要なのでしょうか。銀行振り込みの例を考えてみます。A銀行のXさんの口座にある5000円を、B銀行のYさんの口座に振り込むとします。関連するデータがすべてデータベース化されていた場合、単純には次のような処理を行なうことになります(図21)。

- Xさんの口座の金額を5000円減らすUPDATE文を実行する
- Yさんの口座の金額を5000円増やすUPDATE文を実行する
- 振り込みの履歴を記録するデータをINSERT文によって生成する
トランザクションという言葉は、日々発生するデータを記録したものを指す場合もありますので注意してください。
もし何らかのトラブルにより、(1)と(3)が成功し、(2)がうまくいかなかったとします。そうすると、Xさんの口座は金額が引かれただけの状態となってしまい、ビジネス的におかしなことになります。Xさんからクレームが来ることでしょう。また、それではそのときに、(1)を相殺するUPDATE文、(3)を相殺するDELETE文を実行して、元の状態に戻す方法が考えられます。さらに、(2)だけを再実行することも考えられます。しかし、それらの処理でエラーが発生した場合はどうするのか、また、どこで発生したのかを発見させるようなロジックを検討する必要があり、なかなか大変です。
そこで、トランザクションとして(1)(2)(3)の処理を1つで管理し、すべて成功したらトランザクション成功(COMMIT)とし、トランザクションを構成する処理が1つでもうまくいかなかったら、すべて取り消すこと(ROLLBACK)にすると、処理が簡単になります。トランザクションが失敗した場合は元の状態に戻っているので、トランザクションを再実行させることによってカバーできるわけです(図22)。

なお、トランザクションには満たすべき性質を示す、次のようなACID特性というものがあります。
原子性(Atomicity)
トランザクションとして管理された処理が「すべて成功」か「すべて失敗」であることを保証する特性。先ほどの銀行振り込み例が該当します。
一貫性(Consistency)
トランザクションを実行した結果、データベースの内容に矛盾が発生しないようにする特性。例えば図書館で1冊しかない本を貸し出した際、ある瞬間では1人のみにしか貸し出しできません。
独立性(Isolation)
複数のトランザクションが同時に実行されているとき、お互いのトランザクションの影響を受けない状態にあることを保証する特性。1つのトランザクションがほかのトランザクションの処理中の内容に影響を与えないようにする必要があります。
耐久性(Durability)
いったんトランザクションが終了したら、障害が発生してもデータの状態が変わらないことを保証する特性。つまり障害が発生してもそのデータが失われないこと示します。
