ACID (コンピュータ科学)

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内, 検索

ACIDは、Atomicity, Consistency, Isolation, Durabilityから合成された頭字語である。

これ以上分解してはならないという意味の原子性(Atomicity:不可分性)、一貫性(Consistency)、独立性(Isolation)、および永続性(Durability)は、トランザクション処理の信頼性を保証するために求められる性質である。もしACIDがなければデータベースの完全な状態は保証されない。ISO/IEC 10026-1:1992 Section 4に詳述されている。

信頼性のあるトランザクションシステムの性質として1970年代後半にジム・グレイが定義し、これらの性質を自動的に満たすための技術を開発した。1983年にAndreas ReuterとTheo HärderがACIDという略語を考案した。

ACIDとは対照的に、Basically Available, Soft state, Eventual consistency (BASE) という整合性モデルも考案されている。

目次

[編集] 概要

データベースにおいては、データに対する一つの論理的操作の事をトランザクションと呼ぶ。ACIDの各性質を銀行での口座間送金を例にして示す。

[編集] Atomicity

トランザクションに含まれるタスクが全て実行されるか、あるいは全く実行されないことを保証する性質をいう。日本語ではアトミック性または原子性とも呼ばれる。 口座Aから口座Bに対し1万円送金する場合を考えたとき、送金操作は次の2操作によって行われる。

  1. 口座Aの残高から1万円を引く
  2. 口座Bの残高に1万円を加える

Atomicityが保証されるとは、上の操作1、2が全て行われるか、あるいは全く行われないことを指す。どちらか片方だけが実行された場合、銀行全体の預金残高に矛盾が発生してしまう。

[編集] Consistency

日本語では一貫性あるいは整合性とも呼ばれる。トランザクション開始と終了時にあらかじめ与えられた整合性を満たすことを保証する性質を指す。すなわち、データベースのルール、つまり整合性条件を満たさない状態を起こすようなトランザクションは実行が中断される。

預金残高を例にすると、その値は一般的に0あるいは正の値を取る条件を満たす必要がある。よって、口座Aから送金を行うとき、その前後でAの口座残高が負になるような額は送金できないようにする。このようなルールを保証するのがConsistencyの役割である。

[編集] Isolation

トランザクション中に行われる操作の過程が他の操作から隠蔽されることを指し、日本語では分離性、独立性または隔離性ともいう。より形式的には、isolationとはトランザクション履歴が直列化されていることと言える。この性質と性能はトレードオフの関係にあるため、一般的にはこの性質の一部を緩和して実装される場合が多い。

預金残高の例では、残高100万円の口座Aから残高200万円の口座Bに1万円送金する場合の操作が

  1. 口座Aの残高から1万円を引く
  2. 口座Bの残高に1万円を加える

の順序で行われたとする。取りうる内部状態は、

時点 口座A 口座B
送金前 100万円 200万円
実行中 99万円 200万円
送金後 99万円 201万円

の三つになるが、外部からは送金前送金後のいずれかの状態しか観測できない。

[編集] Durability

永続性あるいは持続性と呼ばれる。トランザクション操作の完了通知をユーザが受けた時点で、その操作は永続的となり、結果が失われないことを指す。これはシステム障害に耐えるということであり、DBMS整合性制約をチェック済みでありトランザクションを中止してはいけないということである。多くのデータベース実装では、トランザクション操作を永続性記憶装置上にログとして記録し、システムに異常が発生したらそのログを用いて異常発生前の状態まで復旧することで永続性を実現している。

[編集] 実装

トランザクションによる状態の変更は、例えばデータ自体に加えそれに付随するインデックスの更新のように、複数の変更によって構成される場合が多く複雑である。また、厳密にACIDを実装しようとすると、広範囲なロックを取得したり、多くのデータを複製するなどといった、性能面での劣化が大きくなりすぎることがある。ACIDを厳密に実装することは難しい。

また、ACIDを実現する手続き自体がシステム要因にて失敗してしまう場合もあり、その失敗要因を回避した後に復旧できるような対処を取る必要がある。例えば、UNIXのファイル実装に関して、ジャーナルファイルシステムによるファイルの一貫性の保護や、データのフルバックアップなどの対処など、多くの改善と処理の工夫が取り入れられている。

ACIDはデータベースが全ての処理を一度に処理できることを要求している。実際にはこの処理の手筈を整えるのは難しい。しかし、これを行うのにログ先行書き込み(Write ahead logging)とシャドウページング(Shadow paging)という2つの一般的なテクニックが存在する。どちらの場合でも、読み書きする情報全てに対してロックを取得しておかなくてはならない。ログ先行書き込みの場合、データベースへの実際の書き込みが行われる前にすべてのREDOとUNDOの情報がログに書き込まれることで、アトミック性が保証される。シャドウページングの場合、更新はデータベースのコピーに対して行われ、トランザクションがコミットされたときに新しいデータベースがアクティブ化される。このコピーは全体をコピーするのではなく、変更のない部分は古いバージョンのデータベースへの参照という形で行われる。

複数のトランザクションを並行実行するときは、Isolationの実現に注意するべきである。実際には、完全なIsolationの実現はコストが高いため、実現するトランザクション分離レベルを設定し、実装することとなる。また、分離レベルの実装はデッドロックやライブロック等に注意して行うべきである。例えばツーフェーズロッキング等が一般的に利用される。

トランザクションに関わる参加者が複数の場合、例えばツーフェーズコミット(2PC)が一般的に利用される。ツーフェーズコミットでは各参加者がトランザクションのコミットに同意するか否かについて一致することを保証する。


[編集] トランザクションを考慮したファイルシステム

個人用ツール
名前空間

変種
操作
案内
ヘルプ
ツールボックス
他の言語