データベースに関する一般的な質問に「そのデータベースはACID準拠ですか?」というものがよくあります。そもそも ACID とは何でしょうか?ACID とは、データベースのトランザクションを定義する 4 つの重要な特性、Atomicity(原子性)、Consistency(一貫性)、Isolation(独立性)、Durability(永続性)の頭文字をとった略語です。これらの特性は、データベースが信頼性の高い方法で処理され、データの正確さが維持されるための要件を示しています。ACID 準拠のデータベースは、これらの原則を満たしているものとされています。この記事では、ACID の意味について詳しく説明し、4 つの要素をさらに細かく分解して詳しく解説するとともに、ACID が重要である理由について説明します。
目次
このセクションでは、ACID の 4 つの要素について深く掘り下げ、データトランザクションの信頼性を確保するうえで ACID がどのような役割を果たすのかを詳しく解説します。
原子性は、全ての操作が一体となって完結するという考えに基づいています。データベースのトランザクションは通常、その種類に関係なく、複数の操作で構成されています。原子性では、全ての操作が成功するか、全ての操作が失敗するかのいずれかになります。この性質が重要なのは、各操作は互いに影響を与える可能性があるため、1 つの操作の失敗が予期しない結果を招くことがあるためです。例えば、金融取引を考えてみます。一緒に休暇を過ごす友人に、旅費の負担分として 250 ドルを支払うとします。この取引全体は、支払人の口座からお金が引き出され、受取人の口座に入金されることで成り立ちます。もし原子性がなければ、支払人の口座からお金が引き落とされても、受取人の口座には入金されない可能性があります。その場合、支払人はお金を引き落とされたにもかかわらず、受取人への支払いが完了していない状態が続くことになります。
一貫性とは、トランザクション内で行われる変更が、データベースの制約に一致していることを保証することです。データがどこかの段階でデータベース制約に違反した場合には、トランザクション全体が失敗します。例えば銀行は、事前に合意された当座貸越がない限り、顧客の口座残高がプラスであることを期待します。そのため、顧客が限度額を超えて引き出そうとすると制約違反となり、そのトランザクション内の操作が全てロールバックされて失敗します。
独立性とは、全てのトランザクションが独立した環境で実行され、互いに干渉しないという特性です。引き続き金融取引の例で、銀行の口座残高が 200 ドルで、ATM で 100 ドルを引き出そうとする状況を考えてみます。同時に、あらかじめ設定していた 100 ドルの口座自動引き落としが実行されるとします。独立性の特性により、これらのトランザクションは同時に実行されても、最終的な残高は 0 ドルになることが保証されます。トランザクションが互いに干渉して 100 ドルになることはありません。
永続性は、ACID のもう一つの重要な要素です。トランザクション内で行われた変更は、何が起ころうとも、トランザクションの完了後、データベースに記録されます。これを保証するのが永続性です。これにより、停電やシステムクラッシュが発生しても、データの変更は永続的に保存されます。
前述のように、ACID の本質は、一連の操作、すなわちトランザクションを実行した後で、データが期待どおりの一貫した状態になることを保証することです。ACID の各要素を満たすトランザクションは、ACID トランザクションと呼ばれます。
ACID は、長い間多くのリレーショナルデータベースが提供されてきました。NoSQL ソリューションへの移行を検討するなかで、「NoSQL データベースは ACID に準拠できるのか?」という疑問が生じるのは当然のことです。答えは簡単です。もちろん可能です。全ての NoSQL データベースが ACID に準拠しているわけではありません。しかし、多くのデータベースが ACID に準拠しています。実際、MongoDB は ACID に準拠したデータベースです。MongoDB 4.0 以降では、必要に応じてマルチドキュメントの ACID トランザクション もサポートされています。バージョン 4.2 では、さらに柔軟性を高めるために、分散マルチドキュメント ACID トランザクション が導入されました。
ただし、MongoDB のデータモデリングにおけるベストプラクティスでは、配列や埋め込みドキュメントなどさまざまなデータ型を用いて、関連するデータを 1 つのドキュメントにまとめて保存することが推奨されています。これにより、1つのドキュメント内で処理されるトランザクションが多いため、ACID は必要ありません。
ACID とは別に、BASE という言葉を見かけることがあります。これは、Basically Available(基本的に利用可能)、Soft State(State(常に一貫性を保っている必要はない)、Eventually Consistent(最終的に一貫性のある)の頭文字を取ったものです。BASE では、一貫性よりも可用性が優先されます。BASE はもともと、ACID 準拠が難しい NoSQL データベースのために考案された概念です。しかし、現在では状況が変わり、確実に ACID のほうが望ましい特性となっています。例えば、MongoDB は BASE には準拠できません。MongoDB のトランザクションは一貫性を重視しており、BASE のルールにある「最終的に一貫性が保たれればよい」という考え方とは異なるからです。
この記事では、ACID とは何か、なぜ重要なのか、MongoDB がどのようにして ACID に完全準拠しているかについて解説しました。また、 ACID トランザクション がデータベースの重要な要素であり、MongoDB がマルチドキュメントトランザクションや分散マルチドキュメントトランザクションを通じて、どのようにそれを実現するかについても紹介しました。MongoDB Atlas を導入し、充実したドキュメントデータモデルと ACID 準拠の機能を是非お試しください。
はい、MongoDB は ACID トランザクションにより、ACID に完全準拠しています。ドキュメントデータモデルを活用し、関連データをまとめて保存することで、トランザクションの必要性は排除できます。しかし、必要な場合には、マルチドキュメント ACID トランザクションと分散マルチドキュメント ACID トランザクションを実現する機能が MongoDB にはあります。
ACID とは、Atomic(原子性)、Consistent(一貫性)、Isolated(独立性)、Durable(永続性)の頭文字を取ったもので、データトランザクションの処理方法に関する一連の原則を指します。高い信頼性と正確性が ACID によって実現されます。トランザクション内の操作が 1 つでも完了できなかった場合には、そのトランザクションは失敗し、変更はロールバックされます。
絶対に必要というわけではありません。それでも、MongoDB などの ACID 準拠のデータベースの使用をお勧めします。データベース内のデータが正確であり、他のトランザクションや予期しないシステム上の問題の影響を受けていないという安心感が得られます。