💭

【データベース】ACIDについて改めてまとめてみる

2023/06/24に公開

DBのトランザクション処理に求められる4つの特性であるACIDについて、改めて学んだのでまとめてみる。

A: 原子性 (Atomicity)

「エラーの際にトランザクションを中断し、そのトランザクションすべての書き込みを破棄できること」が、原子性の意味するところ。言い換えるなら「中断可能性 (Abortability)」。

逆にもし原子性がなければ、複数の変更を伴う過程でエラーが生じた場合に実際に効果を持った変更とそうでない変更を知るのが難しくなる。

C: 一貫性 (Consistency)

ACIDにおける一貫性は「データについて常に真でなければならない何らかの言明(不変性)がある」ということ。

『データ指向アプリケーションデザイン』(Martin Kleppmann著 / O'REILLY)では会計システムの例として「常に貸方と借方は等しくなければならない」という不変性を挙げている。

ただ一息に「一貫性」と言っても具体的に意味するところはどのようなアプリケーションであるかに依存するため、「一貫性」を保つようにトランザクションを適切に定義することはDB側というよりもむしろアプリケーション側の責任となる。

I: 分離性 (Isolation)

分離性は「並行して実行されたトランザクションが互いに分離されており、最終的なデータ不整合が生じない」こと。

言い換えると「DBは複数のトランザクションが実際には並行に実行されていたとしても、それらがコミットされた後の結果はそれぞれが順番に実行されていた場合と同じになることが保証される」ことを意味する。この後者の意味合いで直列化可能性 (Serializability) と呼ばれることもある。

分離性を細かくみていくと、そこにはRead Committed分離、スナップショット分離、直列化可能分離、直列化可能スナップショット分離(SSI) といった複数のレベルがある。この分離レベルについては、また別の記事としてまとめようと思う。

D: 永続性 (Durability)

永続性は「トランザクションのコミットに成功したなら、その状態が(半)永久的に保持される」ことを求めるものだ。一般的なRDBだと、この特性の実装として「トランザクション開始前とコミット後の状態をログファイル(ジャーナルファイル)に出力する」形になっていることが多い。

例えばMySQLでは「バイナリログ」と呼ばれるログファイルに作成・削除・挿入・更新に係る操作イベントを都度記録するよう設定でき、障害時はこのバイナリログを用いてのデータ復旧が可能となっている。

https://www.ritolab.com/posts/98

参考

Discussion