IT用語

ACID特性とは?データベースの4つの性質を初心者向けにわかりやすく解説【図解付き】

クマノくらげ

はじめに

データベースについて勉強していると、ACID特性(アシッド特性)という言葉が登場します。

ACID特性は、データベースのトランザクションを安全かつ正確に処理するための重要な考え方です。

しかし、初めて学ぶ方にとっては、

  • ACIDは何の頭文字なのか
  • トランザクションとは何なのか
  • 原子性と一貫性は何が違うのか
  • 独立性は、ほかの処理を完全に止めることなのか
  • 永続性があればバックアップは不要なのか
  • BASE特性とは何が違うのか

といった点が分かりにくいのではないでしょうか。

ACID特性を一言で表すと、

「データベースの処理を、途中で壊したり矛盾させたりせず、安全に完了させるための4つの性質」

です。

ACIDは、次の4つの英単語の頭文字から作られています。

  • Atomicity:原子性
  • Consistency:一貫性
  • Isolation:独立性
  • Durability:永続性

この記事では、ACID特性の意味やトランザクションとの関係、COMMIT・ROLLBACK、分離レベル、BASE特性との違いについて、会話を中心に初心者向けにわかりやすく解説します。

ACID特性とは?

ACID特性はデータベースのトランザクションを安全に処理するための、4つの性質のことだよ。

トランザクションって、クレジットカードの取引みたいなもの?

日常では取引という意味だけど、データベースでは、関連する複数の処理をひとまとまりとして扱う単位を指すんだ。

例えば、銀行口座Aから銀行口座Bへ1万円を振り込む場合、データベースでは次のような処理が行われます。

  1. 口座Aの残高を1万円減らす
  2. 口座Bの残高を1万円増やす

この二つの処理は、片方だけを実行してはいけません。

口座Aからお金を減らしたのに、口座Bへ増えなかったら大変だね。

そうだよね。そこで、この二つを一つのトランザクションとして扱い、安全に処理するためにACID特性が必要になるんだ。

ACIDを銀行振込で考えてみよう

銀行振込を例に、ACID特性の役割を簡単に整理すると次のようになります。

特性銀行振込での役割
原子性出金と入金を両方実行するか、両方取り消す
一貫性振込後も残高などのルールを守る
独立性同時に行われるほかの取引の途中経過を見せない
永続性振込完了後は、障害が起きても結果を失わない

四つとも、同じ振込処理を別の角度から守っているんだね。

その理解が大切だよ。一つずつ詳しく見ていこう。

Atomicity:原子性

原子性とは全部成功するか、全部失敗する性質

Atomicityは、日本語で原子性と呼ばれます。

原子性とは、

トランザクション内の処理をすべて実行するか、すべて取り消すかのどちらかにする性質

です。

途中まで処理された状態を残しません。

どうして原子という言葉を使うの?

トランザクションを、それ以上分けられない一つの処理単位として扱うイメージだからだよ。

銀行振込で考えてみましょう。

  1. 口座Aから1万円を減らす
  2. 口座Bへ1万円を増やす

2番目の処理でエラーが発生した場合、1番目の処理だけが残ると、お金が消えてしまいます。

そこで原子性により、1番目の処理も取り消し、振込前の状態へ戻します。

処理結果口座A口座B
両方成功1万円減る1万円増える
途中で失敗元の残高へ戻る元の残高のまま
許されない状態1万円減る増えない

半分だけ成功することを防ぐんだね。

そう。原子性は「全部か、何もなしか」と覚えると分かりやすいよ。

COMMITとROLLBACK

原子性を理解するうえで重要なのが、COMMITROLLBACKです。

COMMITとは

COMMITは、トランザクション内で行った変更を確定する処理です。

銀行振込であれば、出金と入金の両方が正常に終了した後にCOMMITを行います。

ROLLBACKとは

ROLLBACKは、トランザクション内の変更を取り消し、処理前の状態へ戻すことです。

途中でエラーが発生した場合はROLLBACKを実行し、中途半端な変更を残さないようにします。

用語意味
COMMITトランザクションの変更を確定する
ROLLBACKトランザクションの変更を取り消す
BEGIN/START TRANSACTIONトランザクションを開始する

処理のイメージは次のとおりです。

BEGIN;

UPDATE accounts
SET balance = balance - 10000
WHERE account_id = 'A';

UPDATE accounts
SET balance = balance + 10000
WHERE account_id = 'B';

COMMIT;

途中でエラーが発生した場合は、COMMITの代わりにROLLBACKを行います。

ROLLBACK;

Consistency:一貫性

一貫性とはデータベースのルールを守る性質

Consistencyは、日本語で一貫性、または整合性と呼ばれます。

一貫性とは、

トランザクションの前後で、データベースに設定されたルールや制約が守られる性質

です。

正しいデータだけを残すということ?

大まかにはそうだね。例えば、残高をマイナスにしてはいけないというルールがあれば、処理後もそのルールを守る必要がある。

一貫性に関係するルールには、次のようなものがあります。

  • 主キーを重複させない
  • 必須項目を空欄にしない
  • 存在しない顧客の注文を登録しない
  • 在庫数を0未満にしない
  • 年齢に負の数を登録しない
  • 口座残高や合計金額の整合性を保つ

こうしたルールは、主にデータベースの制約やアプリケーションの処理によって実現します。

制約役割
PRIMARY KEY同じ主キーの重複を防ぐ
UNIQUE指定した値の重複を防ぐ
NOT NULL必須項目を空欄にさせない
FOREIGN KEY関連するデータ同士の整合性を保つ
CHECK値が条件を満たしているか確認する

原子性と一貫性の違い

原子性と一貫性が似ている気がする。

原子性は処理が途中で終わらないこと。一貫性は処理後もルール違反のデータを残さないことだよ。

項目原子性一貫性
注目する点処理が全部完了したかデータがルールを守っているか
防ぐもの一部だけ実行された状態矛盾したデータ
出金だけして入金しない状態を防ぐ存在しない顧客の注文を防ぐ
主な仕組みCOMMIT、ROLLBACK制約、検証、業務ルール

原子性は処理のまとまり、一貫性はデータの正しさなんだね。

Isolation:独立性

独立性とは同時処理の影響を適切に分離する性質

Isolationは、日本語で独立性分離性、または隔離性と呼ばれます。

独立性とは、

複数のトランザクションが同時に実行されても、お互いの途中経過が不適切に影響しないようにする性質

です。

一度に一人しかデータベースを使えないようにするの?

そうではないよ。実際には複数の処理を同時に進めながら、結果が矛盾しないように制御するんだ。

例えば、在庫が残り1個の商品を、AさんとBさんが同時に購入しようとしたとします。

適切な制御がなければ、二人とも「在庫あり」と判断し、1個しかない商品を二人へ販売してしまう可能性があります。

独立性によって、同時処理によるデータの矛盾を防ぎます。

独立性をレジで例えてみよう

独立性を身近な例で説明できる?

スーパーのレジで考えてみよう。

二人の店員が、同じ買い物かごの会計を同時に変更しているとします。

一人目の店員が商品を登録している途中に、二人目の店員が未完成の会計情報を見て金額を変更すると、正しい合計金額が分からなくなります。

そこで、一つの会計処理が終わるまで途中の状態をほかの処理から見えないようにしたり、同じデータを同時に変更できないようにしたりします。

完成していない途中経過を見せないことが大切なんだね。

同時実行で起こる代表的な問題

独立性が不十分な場合、次のような問題が発生する可能性があります。

ダーティリード

ほかのトランザクションがまだCOMMITしていない変更を読み取る現象です。

後からその変更がROLLBACKされると、存在しなかったはずのデータを読んだことになります。

ノンリピータブルリード

同じトランザクション内で同じ行を2回読み取ったとき、途中でほかのトランザクションが更新・確定したため、結果が変わる現象です。

ファントムリード

同じ検索条件で再度検索したとき、ほかのトランザクションが行を追加・削除したため、取得される行の数が変わる現象です。

ロストアップデート

複数のトランザクションが同じデータを更新し、片方の更新結果をもう片方が上書きして失わせる現象です。

問題内容
ダーティリード未確定のデータを読み取る
ノンリピータブルリード同じ行を再読したときに値が変わる
ファントムリード同じ条件で検索したときに行が増減する
ロストアップデート一方の更新が他方によって失われる

トランザクション分離レベルとは?

独立性を強くすれば、すべて解決するの?

独立性を強くすると安全性は高まるけれど、同時処理の性能が下がることがあるんだ。

そこでデータベースでは、どこまでトランザクションを分離するかをトランザクション分離レベルで調整します。

代表的な分離レベルは次の四つです。

分離レベル概要独立性
READ UNCOMMITTED未確定データを読める場合がある低い
READ COMMITTED確定済みデータだけを読むやや低い
REPEATABLE READ同じ行を繰り返し読んでも値を保ちやすい高い
SERIALIZABLE直列実行に近い結果を保証する最も高い

独立性を高めるほど、同時実行による矛盾を防ぎやすくなります。

一方で、ロック待ちや処理の競合が増え、性能が低下する可能性があります。

なお、各分離レベルで実際にどの問題が発生するかは、使用するデータベース製品やMVCCなどの実装方式によって異なる場合があります。

Durability:永続性

永続性とは確定した変更を失わない性質

Durabilityは、日本語で永続性耐久性と呼ばれます。

永続性とは、

COMMITによって確定したデータは、その後に障害が発生しても失われないようにする性質

です。

振込完了と表示された後にサーバが停止しても、振込結果は残るということ?

そう。完了したはずの処理が、再起動後に消えてはいけないからね。

永続性を実現するために、データベースでは次のような仕組みが使われます。

  • トランザクションログ
  • ジャーナル
  • WAL
  • ディスクなどの不揮発性記憶装置
  • レプリケーション
  • チェックポイント
  • 障害発生後のリカバリ処理

WALとは

WALは、Write-Ahead Loggingの略です。

データ本体を変更する前に、どのような変更を行うかをログへ記録します。

障害が発生した場合はログを利用し、確定済みの処理を復元したり、未確定の処理を取り消したりします。

永続性とバックアップの違い

永続性が保証されていれば、バックアップは不要?

それは違うよ。

永続性は、確定したトランザクションを通常の障害から守るための性質です。

しかし、次のような問題にはバックアップが必要です。

  • 利用者が誤ってデータを削除した
  • 不正アクセスでデータを改ざんされた
  • ランサムウェアによってデータが暗号化された
  • ストレージ全体が破損した
  • 災害によってシステムと複製先が失われた
  • 誤った処理を正常にCOMMITしてしまった
項目永続性バックアップ
主な目的確定済み処理を障害後も維持する過去の状態へ復元できるようにする
守る対象COMMIT済みの変更データベース全体や特定時点のデータ
主な仕組みログ、WAL、ストレージへの書込みフル、差分、増分バックアップ
誤削除への対応原則として防げない過去データから復元できる場合がある

永続性があっても、間違った変更まで永続的に残る可能性があるんだね。

そう。だからバックアップやアクセス制御も必要なんだ。

ACID特性をまとめて確認しよう

頭文字英語日本語一言でいうと
AAtomicity原子性全部成功するか、全部取り消す
CConsistency一貫性データのルールを守る
IIsolation独立性同時処理の途中経過を適切に分離する
DDurability永続性確定した結果を失わない

銀行振込で順番に考えると覚えやすいよ。

  • A:出金と入金を片方だけ実行しない
  • C:振込後も残高やデータのルールを守る
  • I:同時に行われるほかの振込と混ざらない
  • D:振込完了後は結果が消えない

ACID特性のメリット

データの信頼性を高められる

ACID特性によって、処理途中の不完全なデータや、ルールに反したデータが残ることを防ぎやすくなります。

金融、在庫、予約、受注管理など、正確性が重要なシステムでは特に大切です。

障害が発生しても復旧しやすい

ログやROLLBACKの仕組みにより、処理中に障害が起きても、データベースを矛盾の少ない状態へ戻しやすくなります。

同時アクセスによる矛盾を防げる

複数の利用者が同じデータを同時に操作しても、ロックやMVCCなどの仕組みによって矛盾を防ぎます。

アプリケーションの処理を考えやすくなる

トランザクションが成功したか失敗したかを明確に扱えるため、アプリケーション側でもエラー処理を設計しやすくなります。

ACID特性のデメリット・注意点

性能が低下することがある

ACID特性が強いほど、よいデータベースなの?

安全性は高まるけれど、処理速度とのバランスが必要だよ。

厳密な独立性や永続性を保証するには、次のような処理が必要になります。

  • データのロック
  • ログへの書込み
  • ディスクへの同期
  • 競合する処理の待機
  • 分散環境での合意処理

そのため、大量のアクセスを高速に処理したいシステムでは、性能へ影響する場合があります。

ロック待ちやデッドロックが発生することがある

複数のトランザクションがデータをロックすると、ほかの処理が解除を待つことがあります。

また、複数の処理が互いのロック解除を待ち続ける状態をデッドロックといいます。

データベースは通常、デッドロックを検出すると、いずれかのトランザクションを中止して解消します。

分散システムでは実現が複雑になる

一つのデータベース内でACID特性を実現する場合と比べ、複数のサーバやデータセンターにまたがるトランザクションでは制御が複雑になります。

通信障害やサーバ停止が起こる可能性があるため、整合性、可用性、処理速度のバランスを考える必要があります。

ACID特性とBASE特性の違い

BASE特性という言葉も聞いたことがあるよ。

BASEは、大規模な分散システムなどで使われる考え方だよ。

BASEは一般的に、次の言葉の頭文字として説明されます。

  • Basically Available:基本的に利用可能
  • Soft state:状態が一時的に変化することを許容する
  • Eventually consistent:最終的に整合性が取れる

BASEでは、すべての場所で常に同じデータを持つことよりも、システムを利用し続けられることや、処理を拡張しやすいことを重視します。

一時的にデータの違いが発生しても、時間がたてば整合する結果整合性を許容する場合があります。

ACIDとBASEの比較

項目ACIDBASE
重視するもの厳密なトランザクション処理可用性や拡張性
整合性処理の前後でルールを守る一時的な不一致を許容することがある
主な用途金融、決済、在庫、予約SNS、アクセス解析、大規模Webサービス
データ更新厳密に確定する最終的な整合を目指す
システム構成RDBで代表的分散型NoSQLでよく説明される
長所データの正確性を保ちやすい大規模化や高可用性に対応しやすい
短所高負荷・分散環境では制御が複雑一時的に古いデータが見える可能性がある

リレーショナルデータベースは必ずACIDで、NoSQLは必ずBASEなの?

必ずしもそうではないよ。

現代のデータベースには、NoSQLでもトランザクション機能を提供するものや、用途に応じて整合性レベルを調整できるものがあります。

ACIDとBASEは、製品を単純に二分するラベルではなく、どの性質を重視してシステムを設計するかを理解するための考え方です。

ACIDの一貫性とCAP定理の一貫性は同じ?

CAP定理にも一貫性が出てくるよね。ACIDの一貫性と同じなの?

同じ日本語が使われるけれど、注目している内容が違うよ。

項目ACIDのConsistencyCAPのConsistency
主な意味トランザクション前後で制約や業務ルールを守る分散したノードから同じ最新データが見える
注目対象データの妥当性・整合性複数ノード間のデータの見え方
残高を不正な値にしないどのサーバから読んでも同じ残高が見える

ACIDはルールを守る一貫性で、CAPは複数サーバの値をそろえる一貫性なんだね。

そう。試験でも混同しやすいので注意しよう。

ACID特性とロックの関係

ACID特性は、単一の機能だけで実現されるものではありません。

データベース管理システムは、さまざまな仕組みを組み合わせてACID特性を実現します。

仕組み主に関係する特性内容
COMMIT・ROLLBACK原子性全処理の確定・取消しを行う
制約一貫性不正な値や関係を防ぐ
ロック独立性同じデータへの競合を制御する
MVCC独立性複数バージョンを使って読み書きを分離する
トランザクションログ原子性・永続性障害時の取消しや再実行に使う
WAL永続性データ変更前にログを記録する
チェックポイント永続性・復旧復旧処理の起点を作る

MVCCとは?

MVCCって何?

Multi-Version Concurrency Controlの略で、データの複数のバージョンを管理する同時実行制御だよ。

例えば、あるトランザクションがデータを更新している間、別のトランザクションには更新前の確定済みバージョンを見せます。

これにより、読み取り処理と書き込み処理が互いに待つ場面を減らしながら、独立性を保ちやすくなります。

ただし、MVCCの具体的な動作は、データベース製品や分離レベルによって異なります。

ACID特性が重要になるシステム

ACID特性は、データの不一致が大きな問題につながるシステムで特に重要です。

システムACID特性が重要な理由
銀行・決済お金の増減を正確に処理する必要がある
ECサイト注文、支払い、在庫を矛盾なく更新する必要がある
予約システム同じ座席や部屋の二重予約を防ぐ必要がある
会計システム取引記録や残高を正確に保つ必要がある
在庫管理在庫数が実際の入出庫と一致する必要がある
人事・給与給与や勤務データを正確に処理する必要がある
医療システム患者情報や処方情報の矛盾を防ぐ必要がある

トランザクションを長くしすぎてはいけない理由

安全のために、たくさんの処理を一つのトランザクションへ入れればいいの?

トランザクションが長すぎると、別の問題が起こるよ。

長時間のトランザクションには、次のようなデメリットがあります。

  • ロックを長時間保持する
  • ほかの処理の待ち時間が増える
  • デッドロックの可能性が高まる
  • ROLLBACK時の負担が大きくなる
  • ログの量が増える
  • システム全体の処理性能が低下する

そのため、トランザクションには、データの整合性を守るために必要な処理だけを含め、できるだけ短時間で完了させることが基本です。

ITパスポート・基本情報・応用情報の試験対策

ACID特性は、データベース分野の基本用語です。

ITパスポート、基本情報技術者試験、応用情報技術者試験では、四つの性質の意味や、トランザクション処理との関係を問われる可能性があります。

試験別に押さえたい内容

試験主な対策ポイント
ITパスポートACIDがトランザクションの信頼性を保つ性質であること
基本情報技術者A・C・I・Dそれぞれの意味、COMMIT、ROLLBACK
応用情報技術者分離レベル、同時実行制御、ロック、障害回復との関係

試験で覚えたい重要用語

用語覚える内容
原子性全部実行するか、全部取り消す
一貫性制約や業務ルールを守る
独立性同時トランザクションの影響を分離する
永続性COMMIT済みの変更を失わない
COMMIT変更を確定する
ROLLBACK変更を取り消す
ダーティリード未確定データを読み取る
デッドロック複数処理が互いのロック解除を待つ
分離レベルトランザクション同士を分離する強さ
WALデータ変更前にログを記録する方式

試験での見分け方

問題文に次のような表現があれば、対応する特性を考えましょう。

問題文の表現対応する特性
一連の処理をすべて実行するか取り消す原子性
制約を満たし、矛盾のない状態を保つ一貫性
同時処理の途中結果を互いに見せない独立性
障害後も確定済みの更新結果を保持する永続性

「途中まで実行された状態を残さない」なら原子性だね。

そう。「サーバが停止しても確定結果が残る」なら永続性だよ。

よくある誤解

ACIDはデータベース製品の名前ではない

ACIDというデータベースがあるの?

ACIDは製品名ではなく、トランザクションが備えるべき性質をまとめた言葉だよ。

原子性は処理が高速という意味ではない

原子性の「原子」は、処理速度やデータの小ささを表しているわけではありません。

トランザクション全体を、途中で分割できない一つの処理単位として扱うという意味です。

一貫性はすべての入力内容が正しいことを保証しない

一貫性があれば、間違ったデータは絶対に登録されない?

データベースに定義されたルールの範囲で整合性を保つという意味だよ。

例えば、年齢欄に「30」という値が入力され、データ型や制約に違反していなければ登録できます。

しかし、その人の本当の年齢が31歳だったとしても、データベースだけでは判断できない場合があります。

一貫性は、現実世界のすべての事実が正しいことまで自動的に保証するものではありません。

独立性は処理を必ず一件ずつ実行することではない

独立性は、すべてのトランザクションを実際に完全な直列で実行するという意味ではありません。

複数の処理を並行して実行しながら、矛盾しない結果になるように制御することが目的です。

永続性があってもバックアップは必要

永続性は、確定した処理を障害後も維持する性質です。

誤操作、攻撃、災害、データ破損などから復旧するためには、バックアップやレプリケーション、災害復旧計画も必要です。

ACID特性があれば絶対に障害が起きないわけではない

ACID特性は、トランザクション処理の信頼性を高めます。

しかし、次のような問題をすべて防ぐものではありません。

  • SQLの処理内容自体が間違っている
  • 業務ルールの設計が誤っている
  • 不正な利用者に正しい権限が与えられている
  • バックアップが取得されていない
  • アプリケーションに脆弱性がある
  • インフラ全体が破壊される

ACID特性は、データベースの安全性を支える重要な要素ですが、セキュリティやバックアップを含むすべての対策の代わりにはなりません。

ACID対応なら常に最高性能になるわけではない

ACID特性を厳密に保証するには、ログ記録、ロック、同期処理などが必要です。

そのため、安全性や整合性を高めるほど、処理速度や可用性に影響する場合があります。

システムの目的に応じて、必要な整合性や分離レベルを選ぶことが重要です。

まとめ

ACID特性とは、データベースのトランザクションを安全かつ正確に処理するための四つの性質です。

銀行振込のように複数の更新を一つの処理として扱う場合、途中で一部だけが実行されたり、ほかの処理と混ざったりすると、データに重大な矛盾が生じます。

そこでACID特性によって、次の状態を目指します。

  • 処理を全部成功させるか、全部取り消す
  • 処理後もデータベースのルールを守る
  • 同時に実行される処理の影響を適切に分離する
  • 確定した変更を障害後も失わない

最後に要点を整理します。

項目内容
用語ACID特性
一言でいうとトランザクションを安全に処理するための四つの性質
Atomicity全部成功するか、全部取り消す原子性
Consistency制約や業務ルールを守る一貫性
Isolation同時処理の影響を分離する独立性
Durability確定済みの変更を失わない永続性
関連用語トランザクション、COMMIT、ROLLBACK
独立性の関連用語ロック、MVCC、分離レベル
永続性の関連用語トランザクションログ、WAL、障害回復
BASEとの違いACIDは厳密な処理、BASEは可用性や結果整合性を重視
試験対策四つの性質を具体例と結びつけて覚える
覚え方「全部・正しく・混ざらず・消えない」

ACID特性は、データベースの処理を安全に行うための四つの約束なんだね。

そう。銀行振込なら、出金と入金を全部実行するか全部取り消すのが原子性だよ。

振込後も残高のルールを守るのが一貫性、同時に行われる別の振込と混ざらないのが独立性だね。

そして、振込完了後に障害が起きても結果が残るのが永続性だよ。

全部、正しく、混ざらず、消えない。これなら覚えやすそう!

その四つを具体例と一緒に理解しておけば、ITパスポート、基本情報、応用情報の問題にも対応しやすくなるよ。

ABOUT ME
クマノくらげ
クマノくらげ
難しいIT用語やビジネス用語を、できるだけ身近な例えで解説するブログです。 「専門用語を見ると眠くなる人」でも読めるように、画像や会話形式を多めにしています。 AWS12冠達成済み。
記事URLをコピーしました