【あしっどとくせい】

ACID特性 とは?

💡 データベースの「絶対に守る4つの約束」
📌 このページのポイント
ACID トランザクション A 原子性 Atomicity 全て成功 or 全て取消 C 一貫性 Consistency 常に整合性の ある状態を維持 I 独立性 Isolation 他の処理から 隔離される D 永続性 Durability 確定データは 永続的に保存 失敗時: ロールバック 処理1 ✓ 処理2 ✓ 処理3 ✗ 全て元に戻す 成功時: コミット 処理1 ✓ 処理2 ✓ 処理3 ✓ 永続化完了
ACIDトランザクションの4つの特性
ひよこ ひよこ

ACID特性って何?なんか難しそう…

ペンギン先生 ペンギン先生

銀行振込をイメージして。「AさんからBさんへ1万円送る」とき、Aから引いてBに足す2つの操作が必要だよね。途中でシステムが落ちてもAから引いただけでBに届かない、みたいなことが起きないようにするのがACIDだよ。

ひよこ ひよこ

原子性って?原子と何の関係があるの?

ペンギン先生 ペンギン先生

原子(アトム)はこれ以上分けられない最小の粒子。それと同じで、トランザクションはこれ以上分けられない「一塊」として扱う。全部成功か、全部なかったことになるか、どちらかしかない。半分だけ成功、はない。

ひよこ ひよこ

独立性ってどういうこと?

ペンギン先生 ペンギン先生

同時に複数の人が同じデータを触っても、互いの処理が干渉しないようにする性質。例えば在庫を2人が同時に確認して同時に購入しようとしても、結果がおかしくならないように制御する。

ひよこ ひよこ

独立性のレベルってあるの?

ペンギン先生 ペンギン先生

あるよ。分離レベル(Isolation Level)として4段階が定義されている。Read Uncommitted(最弱、ダーティリード可能)→Read Committed(コミット済みデータのみ読む)→Repeatable Read(同じクエリは同じ結果を返す)→Serializable(最強、完全な直列化)。強くするほど安全だけど性能は低下する。PostgreSQLデフォルトRead Committedだよ。

ひよこ ひよこ

NoSQLはACIDじゃないの?

ペンギン先生 ペンギン先生

従来のNoSQLMongoDB等)は結果整合性(Eventual Consistency)でACIDを緩和していた。でも最近は変わってきていて、MongoDBは4.0からマルチドキュメントトランザクション対応でACID準拠。Google Cloud SpannerNewSQLとしてACID+水平スケールを両立。「NoSQL=ACIDなし」は過去の話になりつつあるよ。

ひよこ ひよこ

障害が起きたときACIDはどうやって守られるの?

ペンギン先生 ペンギン先生

WALWrite-Ahead Logging)という仕組みが鍵だよ。データを変更する前にまずログに記録する。コミット前にクラッシュしたらUNDOログで巻き戻し(原子性)、コミット後にクラッシュしたらREDOログで再適用(永続性)。この仕組みのおかげで、電源が落ちてもデータは守られるんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ACID特性」って出てきたら「データベース信頼性を保つための4つの約束事だな」と思えばだいたいOK!
📖 おまけ:英語の意味
「Atomicity, Consistency, Isolation, Durability」 = 原子性・一貫性・独立性・永続性
💬 まとめると「ACID」になるのは偶然ではなく意図的で、化学の「酸(acid)」のように「ピリッと厳格なデータ管理」を連想させる命名とも言われる
← 用語集にもどる