【データベース】図解でACIDについて解説
ACIDとは
データベース トランザクションの信頼性の高い処理を保証する4つの主要なこと
Atomicity(原子性)、Consistency(一貫性)、Isolation(分離性)、Durability(耐久性)の4つ
トランザクションとは、データの変更を完了させる一連の操作のことです
Atomicity(原子性)
トランザクションは、その一連の処理が全て実行されるか、もしくは何も実行されないかのどちらかである必要があります。
トランザクションを確定させることを「コミット」、トランザクションの処理をなかったことにすること「ロールバック」といいます。
コミットとロールバックについて、口座間の送金を例に解説します。
まずはコミットから解説します。
Aさんの口座に1000円あってBさんの口座に100円ある状態で、Aさんの口座からBさんの口座に500円を送金したいとします。
① まず、Aさんの口座に500円あるか確認します。
② 次に、Aさんの口座から500円を差し引きます。
③ 次に、Bさんの口座から500円を足します。
④ 最後に、問題なく送金処理が行えたため、この一連の処理を確定します。
次に、ロールバックについて解説します。
先程と同様に送金を例に解説します。
① まず、Aさんの口座に500円あるか確認します。
② 次に、Aさんの口座から500円を差し引きます。
③ トランザクションの処理中に何かしらのエラーが発生したとします。
このままトランザクションを確定してしまうと、ただAさんの口座の金額1000円が500円に減ってしまいます。
Aさんの視点で考えると、なぜか500円が消えてしまったので、この銀行にお金を預けたいとは思いませんよね。
④ 最後に、一連の処理をなかったことにします。
こうすることで、Aさんの口座の金額も1000円の状態に戻ります。
Consistency(一貫性)
トランザクションの前後でデータベースが正しい状態を保つことを保証します
一連の処理が確定した場合、データベースの整合性制約が全て満たされる状態にならないといけないです。
データベースでユーザーの口座情報を保持しているとします。
口座の金額について負の値にならないという制約があったとします。
なので、先程の送金の例で言うと、Aさんの口座に1000円あって1500円をBさんに送金しようとするとAさんの口座は-500円になるので、そういった場合はデータベースで決めたルールに則ってこのような処理を行うことはできないです。
Isolation(分離性)
複数のトランザクションが同時に実行される場合、それぞれのトランザクションが他のトランザクションの影響を受けないことを保証します
夫婦で共同所有している口座に旦那さんと奥さんが同時にお金を出金する例で解説します。
夫婦の口座には1000円が入っており、旦那さんが1000円、奥さんが500円を同時に出金したとします。
この2つのトランザクションを同時に実行してしまうと、1000-1500=-500円となってしまい、口座に1500円も入っていないのに2人とも出金できてしまいます。
なので、どちらかのトランザクションを優先させ、旦那さんが1000円出金するトランザクションを確定させます。
そうすることで、夫婦の口座は0円になります。
次に、奥さんが500円出金するトランザクションを実行します。
この場合はすでに口座にお金は入っていないので、ロールバックさせます。
Durability(耐久性)
トランザクションが確定した場合、その結果は失われないことです。
例えば、システム障害が発生しても、成功したトランザクションの結果は失われません。
Discussion