【データベース】データの信頼性を守る命綱!トランザクションの「ACID特性」とは
データベース(RDBMS)を扱う上で、絶対に避けて通れない最重要概念が「トランザクション(Transaction)」である。
銀行の口座振込やECサイトの注文処理など、複数のデータ更新を「1つの不可分な処理単位」として扱う仕組みを指す。
そして、このトランザクション処理が安全かつ正確に行われるために、RDBMSが保証すべき4つの性質の頭文字をとったものが「ACID(アシッド)特性」だ。
今回は、システム開発やデータベース設計の基本となるACID特性をわかりやすく整理した。
1. ACID特性の4つの要素
データベースのデータ破壊を防ぎ、整合性を完璧に保つためにRDBMSが備えるべき4つの原則は以下の通りである。
- A:Atomicity(原子性 / All or Nothing)
トランザクションに含まれる一連のデータ操作は、「すべて完全に実行される(Commit)」か「まったく実行されなかった状態に戻る(Rollback)」かのどちらか一方にしかならない性質。
途中でエラーやシステム障害が発生した場合、中途半端に一部だけが更新された状態が残ることは絶対にない。 - C:Consistency(一貫性 / 整合性)
トランザクションの開始前と終了後で、データベースの整合性制約(主キー制約、外部キー制約、NOT NULL制約など)が常に満たされている性質。
ルールに違反するような不正なデータ変更が行われそうになった場合、トランザクション全体が自動的に取り消される。 - I:Isolation(独立性 / 隔離性)
複数のトランザクションが同時に並行実行されていても、互いの処理過程が干渉・影響し合わない性質。
他のトランザクションからは「まだ確定していない途中の状態」が見えず、あたかも1つずつ順番に実行(直列化)されたかのような結果が保証される。 - D:Durability(永続性 / 堅牢性)
トランザクションが一度確定(Commit)または取消(Rollback)した時点で、その結果は永続的に記憶され、絶対に失われない性質。
確定直後にサーバーの電源が落ちたりシステム障害が発生したりしても、REDOログ等の仕組みによってデータは確実に復元される。
2. 具体例:銀行の口座振込で考えるACID
「Aさんの口座からBさんの口座へ1万円を振り込む」というトランザクション(①A口座から1万円引く ➔ ②B口座に1万円足す)を例に挙げると、ACID特性の重要性がより明確になる。
【振込処理におけるACIDの役割】
・原子性: ①のあと回線が切れても、B口座に足されずにA口座の1万円だけ消える(消滅する)事故を防ぐ(ロールバックされる)。
・一貫性: 残高がマイナス不可の制約がある場合、残高不足なら振込処理自体をエラーにして弾く。
・独立性: Aさんが振込処理を行っている最中に、CさんがAさんの残高を参照しても「振込途中の確定していない残高」は見えない。
・永続性: 「振込完了」の画面が出た直後に銀行のDBサーバーが停電しても、1万円の移動記録は消えずに残る。
・原子性: ①のあと回線が切れても、B口座に足されずにA口座の1万円だけ消える(消滅する)事故を防ぐ(ロールバックされる)。
・一貫性: 残高がマイナス不可の制約がある場合、残高不足なら振込処理自体をエラーにして弾く。
・独立性: Aさんが振込処理を行っている最中に、CさんがAさんの残高を参照しても「振込途中の確定していない残高」は見えない。
・永続性: 「振込完了」の画面が出た直後に銀行のDBサーバーが停電しても、1万円の移動記録は消えずに残る。
3. まとめ
Webアプリケーションや基幹システムにおいて、データの辻褄が合わなくなるバグを防いでいるのは、RDBMSが提供するこのACID特性のおかげである。
システム設計時には、特に「隔離性(Isolation)レベルの設定(Dirty ReadやPhantom Readの防犯)」や「デッドロックの防止」など、ACID特性を意識したトランザクション設計を行うことが求められる。
【トランザクション設計のチェック項目】
✔ 複数の更新クエリが「1つのトランザクション」としてコミット/ロールバック制御されているか?(原子性)
✔ アプリ側の処理異常時に確実に
✔ 同時実行時のロック範囲や分離レベル(Read Committed等)が適切に設計されているか?(独立性)
✔ 複数の更新クエリが「1つのトランザクション」としてコミット/ロールバック制御されているか?(原子性)
✔ アプリ側の処理異常時に確実に
ROLLBACK が発行される構造になっているか?(一貫性)✔ 同時実行時のロック範囲や分離レベル(Read Committed等)が適切に設計されているか?(独立性)
PR