ACID とは、データベースの 4 大特性である原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)、永続性(Durability)の頭文字をとったものです。多くの場合、リレーショナル・データベースに関連付けられていますが、NoSQL(非リレーショナル)データベースも ACID 規則に従うことができます。ACID トランザクションは、市場に出回っている一般的なデータベース・エンジンの多くで一般的であり、読み取り/書き込みアクションがデータの完全性を妨げないようにします。
ACID データベースとは?
ACID のベストプラクティスに従うデータベースには、次のような特徴があります。
- 原子性:原子性により、データの損失、孤立したレコード、部分的なトランザクションを防止します。原子性を備えたデータベースは「オール・オア・ナッシング」のトランザクションを提供し、トランザクションの一部が途中で失敗してもデータが失われないようにします。
- 一貫性:ACID データベースのテーブル制約では、全てのトランザクションで一貫した形式でデータを保存する必要があります。
- 独立性:ACID データベースは、データを独立させ、トランザクションを 1 つずつ実行することで、トランザクションがダーティ読み取り/書き込みを返さないようにします。
- 永続性:システム障害(停電など)はトランザクションの妨げとなる可能性があるため、ACID データベースはフェイルオーバーにより重要なイベントからのデータ損失を防止します。
原子性
モダンなデータベースのトランザクションでは、レコードを確定するステップが複数あります。例えば、顧客は注文を作成する場合、ストアド・プロシージャでは INSERT 文を使用して、注文テーブルと product_ordered テーブルにレコードを追加します。注文テーブルへのレコードの追加に失敗した場合、product_ordered テーブルにレコードを追加は行いたくありません。これにより、孤立したレコードが作成されることになります。
原子性により、データベースは、障害が発生したときに全てのトランザクションをロールバックし、データの一貫性を維持し、破損を回避します。トランザクションの全てのステップが正常に完了した場合にのみ、データが保存されます。原子性は、データの破損、データ損失、孤立した記録を回避します。
一貫性
リレーショナル・データベースには、特定のタイプのデータのみを保存できる制約があります。NoSQL データベースは、独自の設定フォーマットでデータを保存します。例えば、注文合計列に小数値のみを保存できるように指定した場合、文字列を保存しようとすると失敗します。データの一貫性を保つことで、開発者はデータセットを操作する際に既知の価値を得ることができます。
データベース内の一貫性とは、データを予測できることを意味します。つまり、特定のレコードのデータを取得すると、期待される結果が得られるということです。注文テーブルの例を使用すると、注文合計列から値を取得するクエリでは、必ず数値が返されることがわかります。
独立性
ダーティ読み取りとダーティ書き込みは、データベースが値を変更している特定の時点でユーザーがクエリを実行するときに発生します。例えば、その月の全ての注文の合計を把握したい場合、注文の合計が更新された時点でデータを読み取ると、誤った結果が表示されることがあります。前の更新ステートメントを実行する前にデータが読み取られる場合、書き込みアクションでも同じことが起こります。
ダーティ読み取りやダーティ書き込みは、データが破損し、データの整合性が損なわれるおそれがあります。独立したトランザクションはステートメントを 1 つずつ実行するため、数百万のトランザクションであってもデータの一貫性と中断はありません。独立したトランザクションは、レコードをロックし、変更を行い、次のトランザクションのためにレコードをリリースできます。
永続性
構造化データベースと非構造化データベースの両方が、システム障害が発生しても、トランザクションが完了した後、一貫して永続的にデータを保存する必要があります。トランザクションログやインフラの障害も実装する必要がありますが、データベース自体は、データの破損を引き起こすことなく、データを一貫して保存できる必要があります。データベース・エンジンには独自の戦略とフェイルオーバー技術がありますが、管理者はデータを復元するためにそれらに依存する必要があります。
例えば、停電によりトランザクションが途中で中断される場合があります。管理者がトランザクションをロールバックしたり、データをリカバリしたりする必要がある場合は、データベースが障害を処理できなければなりません。ほとんどの管理者にとって、フェイルオーバーはバックアップと冗長性によっても処理されます。ACID は、組織の大規模なディザスタ・リカバリ戦略を支援します。
まとめ
ミッションクリティカルなデータベースには、エンタープライズ・アプリケーションをサポートするために ACID 特性が必要です。ACID 特性は、データの完全性と、必要な数のアプリケーションがデータを取得して使用できるようにするために不可欠です。管理者は、依然として、バックアップを取り、データベース・サーバーがスムーズに動作するようにする必要がありますが、ACID 特性を持つことは事業継続のために不可欠です。