トランザクションとは
トランザクションとは、データベースにあるデータを操作・制御する際の「動作のまとまり」を表す単位のことです。
例えば、買い物をイメージしてみましょう。
買いたいものを選ぶ、レジで値段を確認する、支払う等は1つ1つの動作(処理)です。
動作のまとまりとは、例えばお遣いに行って帰ってくるまでのようなイメージです。
お遣いに行って帰ってくるまでには、①スーパーに行く⇒②買うものを選ぶ⇒③レジで値段を確認する⇒④支払いをする⇒⑤袋に入れる⇒⑥持ち帰る、という6つの動作が入っています。
このように、複数の動作を1まとまりとする単位がトランザクションのイメージです。
トランザクションには、以下の4つの特性があります。
- 原子性(A:Atomicity)
- 一貫性(C:Consistency)
- 独立性(I:Isolation)
- 永続性(Durability)
原子性(A:Atomicity)
原子性とは、「0か100かしかない」という特性のことです。
「不可分性」とも呼ばれます。
トランザクション(1セットの動作)の途中で不具合が生じてしまい、最後まで処理されなかった場合、「最初(始める前の状態)に戻る」という性質です。
トランザクションは基本的に分けることができない1セットとして扱われる為、途中で終わってしまうと正しいデータではなくなってしまう可能性があるからです。
例えば、PayPayで友達にお金を送金した時に、あなたの口座からは送金した分の金額が減り、友達の口座では送金した分のお金が増えていなかった場合、あなたが送金したお金の存在が消えてしまっていますよね・・・
このような事態を防ぐために、途中で上手くいかなかったら、送金前の状態に一旦戻しましょう、という性質です。
一貫性(C:Consistency)
一貫性とは、トランザクション(1セットの動作)の前後でデータの条件やルールが破られていないことを保証する性質です。
データベースでは、あり得ないデータになることを防ぐために事前にデータのルールを設定することがあります。
例えば、銀行で1000円しか入っていない口座から3000円を引き出そうとした際に、口座の残高がマイナスにならないように処理をキャンセルするようなイメージです。
トランザクション(引き出し処理)が一貫性の性質を持っていなければ、上記の引き出し処理を行ってしまい、元々1000円しか入っていない口座から3000円が引き出せてしまったり、口座残高が「-2000円」になってしまったり、とあり得えない不整合が起きてしまいます。
独立性(I:Isolation)
独立性とは、1つの処理中に他の処理が入り込まない性質のことです。
1つのデータベースに対して同時に複数のトランザクションが発生した場合、同時に処理を始めるのではなく、1つ1つ処理が完了してから次の処理を行っていく性質のことです。
例えば、聖徳太子の逸話で同時に10人の話を聞いて回答したというようなものがありますが、普通の人が同時に10人に話しかけられたら話が混ざったり混乱したりしてしまう可能性が高いですよね。
このように同時に処理を実行すると、データが不整合を起こしやすくなってしまいます。
1つ1つ正確かつ確実に処理を行っていくのがトランザクションの考え方であり、独立性という性質です。
永続性(D:Durability)
永続性とは、処理が完了(コミット)したトランザクションの結果が保証される性質のことです。
「耐久性」とも呼ばれます。
一度処理が最後まで完了(コミット)したトランザクションの結果は、何があろうと(電源が落ちようと)保持されるという性質です。
トランザクションの処理は、最後まで完了した時点でそこまでは確実に正しいという保証付きのデータになります。
事件の捜査をしている時の防犯カメラの映像のようなイメージです。
トランザクション完了時点の情報までは正しい、と認識してデータを保持します。
例えば、銀行口座は最後にお金を引き出し・預入れした際の残高を次の処理のときまで保持し続けます。いつ確認しても最後の処理が完了した時点の残高が表示されるようになっています。