トランザクションが備えるべき原子性・一貫性・独立性・永続性の4つの性質。
ACID特性とは、トランザクションが備えるべき4つの性質(原子性・一貫性・独立性・永続性)の頭文字を並べた言葉です。トランザクションとは「いくつかの操作をまとめて1つの処理単位として扱うもの」で、たとえば銀行振込の「Aから引く・Bに足す」をひとまとめにしたものを指します。
ACIDは Atomicity / Consistency / Isolation / Durability の頭文字です。この4つを満たすことで、障害が起きても、複数の人が同時に操作しても、データが矛盾しないことが保証されます。
身近な例で考えると、銀行のATMのようなものです。「自分の口座から引いて相手に送る」処理が途中で止まったり、二重に実行されたり、停電で消えたりしては困ります。ACID特性は、こうした「お金の出入りを絶対に間違えない」ための約束事です。
ACIDの4つの要素は、それぞれ次のような意味を持ちます。色は上の図解と対応しています。
・原子性(Atomicity):処理は「全部成功」か「全部なかったことにする」のどちらかに(All or Nothing)
・一貫性(Consistency):処理の前後で、決められた制約を満たした正しい状態を保つ
・独立性(Isolation):複数の処理を同時に走らせても、互いに干渉せず1件ずつ実行したのと同じ結果になる
・永続性(Durability):確定(コミット)した結果は、障害が起きても失われない
| 頭文字 | 英語 | 日本語 | ひとことで言うと |
|---|---|---|---|
| A | Atomicity | 原子性 | 全部成功か、全部なかったことに(All or Nothing) |
| C | Consistency | 一貫性 | 前後で制約を満たした正しい状態を保つ |
| I | Isolation | 独立性 | 同時実行しても互いに干渉しない |
| D | Durability | 永続性 | 確定した結果は障害後も失われない |
覚え方のコツは、「A=途中で止めない」「C=ルールを破らない」「I=他人を邪魔しない」「D=結果を消さない」と動詞でイメージすることです。4つがそろって初めて、安心して使えるデータベースになります。
DBMS(データベース管理システム)は、複数の利用者が同時にアクセスし、停電やプログラム異常といった障害も起こりうる環境で動きます。もしACID特性がなければ、処理の途中で止まったデータや、他人の操作と混ざった矛盾だらけのデータが残ってしまいます。
銀行・予約システム・在庫管理など、1件でも数字がズレたら大問題になる業務では、データの正しさが何より重要です。だからこそ信頼性の高いDBMSは、ACID特性を満たすことを前提に設計されています。
上の図解のように、ACIDがあれば「途中で停電してもなかったことにして元に戻す」ことができます。業務データを安心して任せられる土台が、ACID特性なのです。
4つの特性は、それぞれ別の問題を防いでいます。1つでも欠けるとデータが壊れる可能性があるため、4つがセットで意味を持ちます。
・原子性が壊れると:処理が途中まましか実行されず、「引いたのに届かない」状態が残る
・一貫性が壊れると:「残高はゼロ以上」などのルールが無視され、ありえない値が入ってしまう
・独立性が壊れると:他のトランザクションが処理途中のデータを読んでしまい、計算が間違える
・永続性が壊れると:COMMITで確定したはずのデータが、停電などで消えてしまう
身近なたとえで言うと、ATMで引き出し操作をしたときの話です。原子性がなければ「お金が出てきたのに口座から引かれていない」または逆のことが起こり、一貫性がなければ残高が-100円になれ、独立性がなければ2人が同時に操作して残高がおかしくなり、永続性がなければ取引記録が消えます。4つすべてがあって初めて、安心してATMを使えます。
ACIDと対比されるのがBASEという考え方です。Basically Available(基本的には動く)・Soft state(一時的に矛盾があってもよい)・Eventually consistent(最終的には整合する)の頭文字です。
なぜ2種類あるのかというと、「整合性の厳しさ」と「速さ・規模」はトレードオフ(どちらかを取るともう一方が犠牲になる関係)だからです。
・ACID(厳密):データが絶対に正しい。でも多台に分散するとすべての機器で合意を取らないといけないので遅くなる。銀行・予約システムなど「1円でもズレたら困る」用途に向く。
・BASE(ゆるやか):少し前のデータが見えることがあるが、とにかく高速・大規模。SNSのいいね数・動画の再生数など「少し古くても構わない」用途に向く。
たとえば、SNSのフォロワー数が「999人」と「1000人」で1秒ズレても誰も困りませんが、銀行の残高が1円でもズレたら大問題です。用途に合わせてACIDとBASEを使い分けることが、現代のシステム設計の基本となっています。