Jのブログ

人生の記録

トランザクション処理に必要な特性ACID

ACIDとは、主にデータベースに求められるトランザクションの特性。以下の頭文字の略。

  • Atomicity > 原子性
  • Consistency > 一貫性
  • Isolation > 独立性
  • Durability > 永続性

ACIDは、主にRDBMSにて必要とされるトランザクション処理に必要な特性。 これを担保することで、データの整合性や障害時のデータを保証できる

トランザクション

複数ステップを1つの処理とし、分解できない単位。 銀行振込を例とすると、振込時ののデータシーケンスは以下

  1. 自分の講座から10万円をマイナス
  2. 相手の講座に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の状態しか確認できないようにする。

  1. 自分の口座100万、相手の口座100万
  2. 自分の口座90万、相手の相手の口座100万
  3. 自分の口座90万、相手の口座110万

仮に2の状態を参照したり、変更できたりすると整合性を保てなくなる。

ただし性能影響が大きいので、機能を緩和して実装していることが多い。(トランザクションの分離レベル)

Durability > 永続性

トランザクションを完了した時点で、結果が失われないこと。トランザクション完了直後に障害が発生してもデータは保証される。 データベースではトランザクションログとして記録し、時間がかかるデータ反映は非同期で実施する。これにより、障害が発生した後は1と2が実施される。

  1. ロールバック > トランザクション中だったデータはトランザクション返し前に戻す
  2. ロールフォワード > トランザクション完了しているものは、トランザクションログよりデータを反映する