普段の生活の中で、例えば、旅行に行くなどで、飛行機やホテルをインターネットでしたり、代金の振り込みをATMでしたり、何気なく金額のやり取りをしているわけですが、
よくよく考えてみたら、自分の口座から決まった金額がプラスになったりマイナスになったりするのと同時に、その金額のプラスマイナスに合わせた相手側も同じ金額が増減するといった操作をATMやインターネットで行う場合、現金という物質的なものをやりとりするのとは違って、見えないところでデータがやりとりされていることになり、
はたして、どのようにして、物質的ではない、言わば目に見えない処理はどのように管理されているのでしょうか?
しかも、その処理に間にデータが間違っていたりしたら、そのような送金システムを安心して利用することが難しくなりますし、ひいては経済の発展にも影響も及ぼしかねます。
そこで、例えば、1万円送金したのに、8千円しか届いてないといったような、データに矛盾がなく、一貫した状態でデータのやり取りをする処理にトランザクション処理というものがあります。
2者間で、処理が進行するようなケースで、その操作が複数回にわたり、すべての操作が完全に完了したらデータを更新するか、一つでも正常に処理ができなければその複数の操作をすべてキャンセルして元の状態に戻すことで処理の信頼性を保証しているものです。
本日は、そのトランザクション処理について例を挙げて解説してみます。
トランザクション処理の概念・・・例えば、、、
例えば、Aさんが、旅行に行く計画を立てていて、
検索した中でここに泊まってみたい!ってホテルに予約することを想定します。
①処理の前の状態の例
Aさんの口座には50,000円が現状、入っていて
ホテルには空き室が5部屋あります。
②ホテルのホームページからAさんは実際に予約をします。
ホテルの提案プランの中から、予算に見合うプランを選択、
宿泊人数、宿泊数を入れて、ポチッ。
10,000円の部屋を予約。
③ホテル側には、空室データがあって
その空室データかた1部屋消えます。
Aさんが選択したプランの部屋のデータも、空室⇒予約に変更されます。
④Aさんは前払いでお金を送金します。
元々、Aさんの口座には50,000円入っていたので、
そこから、宿泊料の10,000円が支払われ、
Aさんの口座データは、50,000円から40,000円に更新されます。
同時に、ホテル側も、Aさんからの送金で、10,000円口座のお金が増えることになります。
⑤ここまでの一連の操作が全て行われて、この処理が完了します。
さて、この①~⑤のステップのなかで、
例えば、Aさんが②で予約操作をしたのに、
③でホテルのデータが更新されず、そのまま5部屋だったとします。
その後に、他の人の予約が成功した場合、Aさんが選んだ部屋と
ダブルブッキングなんてトラブルが起こることが考えられます。
また、
④で、Aさんはお金を払って、50,000円が40,000円になったけど、
ホテルの口座には、その10,000円のデータが反映されてない。
なんてことになったら、、、
え?その消えた1万円どーなっちゃうの?ってトラブルになってしまいます。
そのようなトラブルがないように、
①~⑤の操作を1つの操作のかたまりとして処理をし、
①~⑤の全部の操作が完了した場合にのみ、結果を反映させるか、
または、①~⑤の操作の1つでも処理に不備がある場合は、
全ての操作をキャンセルすることを保証する、
つまりは、①の状態、Aさんの口座のお金は50,000円のまま、
ホテルの空室は5部屋のままに戻す処理が
トランザクション処理といいます。
トランザクション処理が持つべき4つの性質
上の例を見てもわかるように、トランザクション処理は超厳密に行われる必要がありますね。
そうでなければ、安心して、ホテルを利用する側も、ホテル側も予約のやりとりができません。
そこで、トランザクションの処理が持つべき4つの性質が定義されています。
その4つとは
- 原子性(Atomicity)
- 一貫性(Consistency)
- 隔離性(Isolation)
- 永続性(Durability)
この4つを、簡単に説明すると
原子性
一連のトランザクションの処理が、すべて実行されるか、
または一連の処理を全て行わないかを保証すること。
上の例ですと、処理が正常に完了するか、
または途中で不備があれば、①~⑤のすべての処理がキャンセルされます。
このときに、元の状態に全て戻されることを「ロールバック」と言います。
一貫性
データベースの内容が矛盾がないこと。
例えば、上の例の③④で、ホテルの空室数が減ったのに、
売上数が合わないといった矛盾がないこと。
隔離性
トランザクションの処理が外部から隠されて、複数のトランザクション処理が重複しないようにすること。
Aさんが予約をしている際に、他の人も予約の作業をしているといった可能性も多分にあります。
そのような場合に、1つ1つのトランザクションの処理が独立的に行われることを保証する必要があります。
永続性
正常に終了したトランザクション処理の結果が、永久的なものであり、
データベースに障害が発生しても、データが消失しないことを保証すること。
上の例で、考えると、①~⑤の処理が正常に終了した場合、Aさんの口座の合計金額は元の金額より10,000円少なくなり、ホテルの空室データは1部屋減り、ホテルの口座には10,000円増えるといった、1つ1つのデータが変更されます。
この変更(更新)された状態の結果を、ゆるぎないものすることが必要になります。
この動作を「コミット」と言います。
この4つの性質をもってトランザクション処理が行われることで、
データの信頼性を確保するといったものです。
参考
まとめ
ということで、ホテルや飛行機の予約、ATMなどでの送金など、
処理が厳密に行われなければならない操作に対して、
その厳密性を保証するトランザクション処理について、
まとめてみました。
- トランザクションは、複数の操作を1つにまとめて処理すること(1部を分離することはできない)
- トランザクションの複数の処理は全部行われるか、全部行われないかのどちらか
- キャンセルされた場合は、すべて元の状態にデータが戻され、正常に完了した場合は変更された状態は永続的なものになる
トランザクション処理って何なの?と疑問に思う方の参考になれば幸いです。