ACID特性とは、トランザクション処理が保持すべき4つの性質の頭文字を取った単語です。

トランザクション処理とは、ある一定の処理の固まりを表す用語。
例えば、AさんからBさんに10万円の送金を行う場合、システムでは以下の3つの処理をすべて行う必要があります。

上記の①~③の処理は1セットとして扱わないと不都合です。①②だけ実行されて、③だけ実行されないようなケースが発生すると大変ですよね。
このトランザクション処理には保持すべき4つの特性があり、それをACID特性と呼びます。データベーススペシャリスト試験等でも必出の超・重要知識です。
このページではACID特性とは何か?を初心者でも理解できるよう具体例を用いながらわかりやすく解説します。
データベースエンジニアを目指す方はもちろん、システムエンジニアやプログラマーを目指す方であれば知らないと恥ずかしい超・基本知識です。
是非最後までご覧ください。
ACID特性とは:わかりやすく
ACID特性とは、トランザクション処理が保持すべき4つの性質の頭文字を取った単語です。
先にも紹介した通りトランザクション処理は1セットで複数の処理(①データベースの読み込み→②データベースの更新→③データベースの更新)が行われます。

ですが、このとき①②だけ処理が行われ、③だけが行われないようなことが発生してしまう可能性がある場合、システムとしての信頼性にかけてしまいます。

ちなみに、上記の例は「①~③が1セットとして全て実行されること or 実行されないこと」を表すAtomicity(原子性)の説明です。

原子性を始めとする4つの性質を1セットで呼び表した単語が「ACID特性」で、実は現代のデータベースではこのACID特性を備えていることがほとんど必須となっています。
ここからは、より具体例にACID特性について1個1個ご説明していきます。
Atomicity:原子性
Atomicity(原子性):トランザクション処理は完全に実行される(COMMIT)、もしくは完全に実行されない(ROLLBACK)性質を表します。

①②の処理だけが実行されてしまうと、データベースが不完全な状態に陥ります。

送金の例でいえば、Aさんの口座からは10万円が減額されるのに、Bさんの口座は増額されない・・・ということに。
このように、1セットの処理が途中で失敗した場合にはすべてを元に戻す仕組みをトランザクションが備えている場合に、そのトランザクションは原子性があるということができます。
Consistency:一貫性
Consistency(一貫性):トランザクションが必ず一定のルールに沿ってデータベースに変更を行う性質を表します。

別の言い方をすればデータベースの条件を満たすようにトランザクションが実行される性質を表します。
例えば、口座番号は "7桁である" という条件がデータベースに設定されているとしたら、誤って8桁の口座番号が指定されてもエラーとなり、データベースの整合性が保たれるようになるような性質です。

SQLでいえばCREATE TABLE文などで、カラムのデータ型や桁数、NOT NULL条件を指定したりしますが、それを行う目的がこの一貫性という性質を満たすということです。
Isolation:独立性
Isolation(独立性):複数の処理が同時に実行されても、それぞれがお互いに干渉しない性質を表します。

例えば、複数のプログラムが同時に同じデータベースやテーブルを更新するような場合、一方のトランザクションがWAIT(処理を中断)したり、エラーにしたりすることで、お互いがお互いのトランザクションを邪魔しないようにする性質です。
Bさんの口座に10万円の送金が行われるタイミングで、逆にBさんからAさんに20万円の送金があったとします。このとき、Bさんの口座情報から10万円が引かれると同時に、20万円の増額処理が走ってしまうと結果の整合性が保てません。
このような不整合が起きないという性質がIsolation(独立性)です。


独立性を維持するための代表的な仕組みの1つが、テーブルのロック(共有ロック/専有ロック)です。
Durabirity:永続性
Durabirity(永続性 または 障害耐久性):一旦確定(COMMIT)したデータは、その後障害が発生しても永遠に変わらず保持される性質。
言い方を変えると、Durabirity(永続性)とはシステム障害に耐えうる性質と言えます。

急に精神論のように聞こえる特性のように思えますが、実は結構奥が深い特性です。
例えば、データベースの冗長化や、ログの保管、ログを用いた障害復旧設計などがDurabirity(永続性)に関連する仕組みと言えます。
以上で、ACID特性の解説は以上になります。最後に復習を兼ねてざっくりとしたACID特性のまとめを掲載しておきます。
システムエンジニアを目指したい方は
システムエンジニアを目指す方や、IT知識を1から身につけたい方は以下のページをご覧ください。
正直どこから学び始めればよいかわからない。どのように勉強していけば、エンジニアとしてのスキルが磨けるか?が分からない・・・という方は必見です。

システムエンジニア向けに「できるエンジニア」になる方法を1から解説しておりますので、是非ご覧ください。