ACID (コンピュータ科学)
出典: フリー百科事典『ウィキペディア(Wikipedia)』
データベースでは、ACIDとはアトミック性(Atomicity)、一貫性(Consistency)、独立性(Isolation)、および永続性(Durability)を意味する言葉である。ACIDはDBMS(データベース管理システム)がトランザクション処理を行うにあたって不可欠な機能であると考えられている。もしACIDがなければデータベースの完全な状態は保証されない。
データベース理論の用語では、データに対する一つの論理的操作の事をトランザクションと呼ぶ。たとえば、預金をある口座から別の口座に移動することはトランザクションであると言えるが、ある口座の預金を減らして別の口座の預金を増やすといったように複数のタスクで構成されている場合もある。ACID特性によってこのようなトランザクションの処理が信頼できるものになる。
- アトミック性(Atomicity)(または最小性)とは、トランザクションの全てのタスクを実行するか全く実行しないかのどちらかであることをDBMSが保証することである。預金の移動は完全に行われるかもしれないし、または理由の如何によっては行えないかもしれない。しかし最小性により一方の預金が増やされなければ他方の預金が減らされないことが保証される。
- 一貫性(Consistency)とはトランザクションの開始時と終了時にデータベースが整合性を保っていることである。すなわち、トランザクションはデータベースのルールないし整合性制約(integrity constraints)を犯さないことを意味する。もし整合性制約で「すべての預金残高は正でなければならない」と定めているならば、このルールを犯すようなトランザクションは中止される。
- 独立性(Isolation)と(または隔離性)はアプリケーションがなんらかの処理を行う際に他の処理から完全に隔離されるようにすることである。すなわち、トランザクションの外の処理からは中間的な状態が全く見えないということである。例えば銀行のマネージャの見る画面では、振込み額は振込み元か振込み先のどちらかの口座に有るように見え、重複して表示されることはない(たとえ振込み処理の最中に問い合わせを行った場合であったとしてもである)。より形式的に言えば、独立性とはトランザクション履歴(transaction history)がシリアライズ可能(serializable)であるということになる。
- 永続性(Durability)とはユーザが一度成功した事の通知を受けるとトランザクションはいつまでも残るものとなり、取り消されない事を保証するということである。これはシステム障害に耐えるということであり、DBMSは整合性制約をチェック済みでありトランザクションを中止する必要はないということである。一般的には、全てのトランザクションはログに書き込まれ、障害の際にはその直前の状態にまでシステムを復元できるようになっている。トランザクションは安全にログに書き込まれ後にコミットされるべきである。
ACID特性を正しく実装するのは簡単ではない。トランザクションを処理する際には多数の小さな変更が必要になる場合がある。たとえばシステムが検索を高速化するのに使用するインデックスの更新などがそうである。また、この手続き自体が色々な理由により失敗してしまう場合もある。たとえば、システムはハードディスクの容量が足りないかもしれない。
ACIDはデータベースが全ての処理を一度に処理できることを要求している。実際にはこの処理の手筈を整えるのは難しい。しかし、これを行うのにログ先行書き込み(Write ahead logging)とシャドウページング(Shadow paging)という2つの一般的なテクニックが存在する。どちらの場合でも、読み書きする情報全てに対してロックを取得しておかなくてはならない。ログ先行書き込みの場合、データベースへの実際の書き込みが行われる前にすべてのREDOとUNDOの情報がログに書き込まれることで、アトミック性が保証される。シャドウページングの場合、更新はデータベースのコピーに対して行われ、トランザクションがコミットされたときに新しいデータベースがアクティブ化される。このコピーは全体をコピーするのではなく、変更のない部分は古いバージョンのデータベースへの参照という形で行われる。
分散トランザクションの場合は、ツーフェーズコミット(2PC)が一般的に利用される。ツーフェーズコミットでは各参加者がトランザクションのコミットに同意するか否かについて一致することを保証する。
トランザクションをパラレルに実行するときは注意が必要である。完全な独立性を保証するためにツーフェーズロッキングが一般的に使用される。
ACID概念はISO/IEC 10026-1:1992 Section 4に詳述されている。