トランザクション処理に必要な特性ACID
ACIDとは、主にデータベースに求められるトランザクションの特性。以下の頭文字の略。
- Atomicity > 原子性
- Consistency > 一貫性
- Isolation > 独立性
- Durability > 永続性
ACIDは、主にRDBMSにて必要とされるトランザクション処理に必要な特性。 これを担保することで、データの整合性や障害時のデータを保証できる
トランザクション
複数ステップを1つの処理とし、分解できない単位。 銀行振込を例とすると、振込時ののデータシーケンスは以下
- 自分の講座から10万円をマイナス
- 相手の講座に10万円をプラス
この、1と2を1つのトランザクションとする。トランザウション処理としないと、1のみ実行された場合、2のみ実行された場合など、口座に不整合が起きる。(自分の口座から10万減って、相手に振り込まれない等) これを1つのトランザクションとすることで、1の処理が完了、2の処理中に障害が発生し場合、ロールバックが行われ1の処理も取り消され、振込が行われなかった状態に戻す。 トランザクションを導入することで、データの整合性を保つことができる。
Atomicity > 原子性
トランザクション単位で、実行されるか、実行されないかの2つの状態のみを取るということ。 先の例にあるように、トランザクションとして1のみ実行、2のみ実行されるという状態はなく、1と2が実行された状態、1と2が実行されていない状態の2つ状態に必ずなる。 1のみ実行された状態で障害が起こった場合は、なにも実行されなかった状態に戻る。逆に、1と2が完了した状態で障害が発生した場合は、必ず1と2が実行された状態が保証される。
Consistency > 一貫性
データの制約を保証する。 重複データNG、マイナスNG、数字以外NG。具体的には、主キー制約、外部キー制約、一意性制約等。
Isolation > 独立性
トランザクション処理中のデータは、変更できない、外部から参照できないようにし独立させ、整合性を保つ。 振込中のデータの1,3の状態しか確認できないようにする。
- 自分の口座100万、相手の口座100万
- 自分の口座90万、相手の相手の口座100万
- 自分の口座90万、相手の口座110万
仮に2の状態を参照したり、変更できたりすると整合性を保てなくなる。
ただし性能影響が大きいので、機能を緩和して実装していることが多い。(トランザクションの分離レベル)
Durability > 永続性
トランザクションを完了した時点で、結果が失われないこと。トランザクション完了直後に障害が発生してもデータは保証される。 データベースではトランザクションログとして記録し、時間がかかるデータ反映は非同期で実施する。これにより、障害が発生した後は1と2が実施される。