トランザクションの ACID 特性について
こんにちは、 @kz_morita です。
トランザクションの ACID 特性についてまとめます。
ACID 特性とは 以下の頭文字を取ったトランザクションの安全性を保証する特性のことです。
Atomicity (原子性) Consistency (一貫性) Isolation (分離性) Durability (永続性) 一つずつ説明していきます。
Atomicity トランザクションが原子 (Atomic) のようにそれ以上分割できない単位になっていることを指します。 トランザクションは、開始されたら commit され正常に終了するか、rollback され中断、破棄されるかのどちらかのみとします。
トランザクションが実行前か実行が完了している状態のどちらかのみのため、アプリケーションは失敗したらリトライすればよくシンプルになります。
SQL でいう、BEGIN ~ COMMIT, BEGIN ~ ROLLBACK は Atomic な単位を宣言するために使われる構文ということになります。
Consistency データが満たすべき制約や整合性が、トランザクションの実行中でも満たされているような性質です。 制約や整合性は、定義されたスキーマ通りのデータであったり、外部キーなどの制約、論理的な制約などになります。
一貫性は、データベースが保証できるものではなく、トランザクションを開始するアプリケーションが保証するものになります。
Isolation 並行して実行されている別のトランザクションとお互いが分離されているような性質です。
分離性にはいろいろなレベルがあり、一番強いレベルの分離性を持つのが、直列化可能性 (Serializability) とよばれるものです。 これは、トランザクションを直列に実行した場合と同じ結果となるように振る舞うような分離レベルになります。
他にも スナップショット分離 や、Read Committed などの Serializability よりも弱い分離レベルがいくつかあります。 (別でまとめようと思います)
Durability トランザクションがコミットされたら、データが失われずに永続化される性質です。
データベースが分散しているかどうかで若干意味が変わります。単一のDBの場合はディスクに書かれたこと(リカバリ用の write-ahead ログなども含む)が、分散されているストレージの場合は、一定数のノードにレプリケーションされているといった形です。
ACID 特性を満たさないものについて ACID 特性を満たさないシステムを BASE と呼ぶそうです。
BASE は以下の頭文字です。