どうもこんにちは!
サバ缶(@tech_begin)です。
データベース関連の学習や、基本/応用情報技術者試験の学習をしているとよく目にする「ACID(アシッド)特性」。
なんとなく理解しているだけだなぁ……。
具体的に説明するのは難しいかも……。
そんなあなたも、今回の記事で(たぶん)理解することが出来るはずです!
ACID(アシッド)とは?
データベースの操作/処理は「トランザクション」という一つのまとまりで実行します。
このトランザクションにおいて、必須ともいえる重要な考え方のことを「ACID」と呼びます。
その考え方には4つあり、それぞれの頭文字をとって「ACID」と呼ばれています。
- Atomicity: 原子性/不可分性
- トランザクション処理がすべて実行されるか、または全く実行されないことを保証する性質
- Consistency: 一貫性
- トランザクション処理後、データの矛盾が生じない性質。
- 常にデータベースの整合性が保たれていることを保証しなければならない性質。
- Isolation: 独立性/隔離性
- 複数のトランザクションを同時実行した場合と、順番に実行した場合の結果が等しくなることを保証する性質。
- トランザクション実行中の過程が隠蔽されることで、他の処理などに影響を与えない性質。
- Durability: 耐久性/永続性
- 一旦正常終了したトランザクションの結果は、以後システムに障害が発生しても失われないことを保証する性質。と呼ばれる場合もあります。
ACIDを使う目的とは
世の中で使われている多くのシステムは、多かれ少なかれデータ(情報)を保持しています。
ユーザの基本情報、クレジットカード情報など取り扱うデータは様々です。
そのデータの重要度・機密度合いも多種多様です。
例えば「カレーレシピ専門アプリ」であれば、仮にレシピデータが吹っ飛んでも人の生活に支障はありません(開発者の気持ちは落ち込みますが)。
一方で、銀行口座のシステムで振り込みがきちんと行うことが出来ないと、私たちの生活に関わります。ECサイトのような通販サービスも同様ですね。
生活に支障をきたすかどうかに関わらず、このようなデータを取り扱う際にシステムに求められる特性や性質のことをACIDとして定義しています。
ACIDという明確な考え方があることによって、システムの構築において大いに役立っています。
具体的にどのようにしてACIDを活用しているのか
ACIDは考え方・概念なので、具体的なツールがあるというわけではありません。
ここでは、銀行口座を例にあげて説明していきます。
Atomicity: 原子性/不可分性
トランザクションが完全に実行されるか、全く実行されないかどちらかであるという性質です。
とあるトランザクションで、2つの処理があったとします。
① Aさんの口座残高から1万円を差し引く
② Bさんの口座残高に1万円を足す
もし①の処理で中断された場合、1万円が消えただけになってしまいます。
そういった中途半端な処理になることを禁止するのがAtomicity(原子性/不可分性)です。
Consistency: 一貫性
トランザクション処理後、データの矛盾が生じないことを保証するための性質です。
① Aさんの口座残高から1万円を差し引く
② Bさんの口座残高に1万円を足す
このとき、Aさんの口座には5000円しか入っていない場合、残高が足りません。
「-5000円」なんて銀行口座としておかしい状態(矛盾)ですね。
このようにシステムとして、データの矛盾が生じてはならないことをConsistency(一貫性)といいます。
Isolation: 独立性/隔離性
複数のトランザクション処理がお互いに干渉しないということです。
複数のトランザクションを同時実行した場合と、順番に実行した場合の結果が等しくなることを保証する性質を持ちます。
トランザクション実行中の過程が隠蔽することで、トランザクション同士を独立させるというもの。
① Aさんの口座残高から1万円を差し引く
② Bさんの口座残高に1万円を足す
つまり、①が完了した後の途中状態はどこからも見ることができず、干渉出来ないというわけですね。
Durability: 耐久性/永続性
トランザクションは「コミット」という処理が実行されると、データベースに反映されます。
このコミットされると、システム障害がいくら起きようとコミット後の状態を保つ性質です。
データベースはシャットダウンしてもデータ保持をしなければなりません。
① Aさんの口座残高から1万円を差し引く
② Bさんの口座残高に1万円を足す
②まで正常に実行したのに、3日後に勝手に情報が消えたら一貫性も耐久性もないことになります。
それはヤバい。
まとめ
以上、ACID特性についての解説でした!
このように、データベースではACID特性に則ったことが必要不可欠と言えます。
データベース管理システム(DBMS)では、これらがシステムに組み込まれているので、1から実装しなければならないということはありません。
各種フレームワークや使用するDBMSによって異なるので、都度調べて活用していきましょう💪
【おまけ】基本情報技術者試験の問題を見てみよう!
トランザクションのACID特性に関する記述のうち,適切なものはどれか。
- ア:コミット後にシステム障害が発生した場合,その内容は変更前の状態に戻される。
- イ:トランザクションが同時に実行されても,互いに干渉しない。
- ウ:トランザクションの実行の結果,データベースの整合性が崩れることも許容する。
- エ:トランザクションの途中でシステム障害が発生しても,障害発生時までの変更内容は保存される。
正解:イ
トランザクションのACID特性の説明として,適切なものはどれか。
- トランザクションでは,実行すべき処理がすべて行われるか,何も処理が行われないかという状態のほかに,処理の一部だけ行われるという状態も発生する。
- トランザクションの実行完了後でも障害の発生によって実行結果が失われることがある。
- トランザクションの実行の結果が矛盾した状態になることはない。
- トランザクションは相互に関連しており,同時に実行されるほかのトランザクションの影響を受ける。
正解:ウ
トランザクションが,データベースに対する更新処理を完全に行なうか,全く処理しなかったのように取り消すか,のどちらかの結果になることを保証する特性はどれか。
- ア:一貫性(consistency)
- イ:原子性(atomicity)
- ウ:耐久性(durability)
- エ:独立性(isolation)
正解:イ