ポイント: ACID特性は、原子性、一貫性、分離性、耐久性を通じてデータの整合性を維持することにより、信頼できるデータベーストランザクションを保証します。これらの原則は、データの破損を防ぎ、データベース管理におけるセキュリティを強化します。
- ベストプラクティスには、データを効果的にモデル化し、トランザクションを小さな部分に分けることが含まれます。
- ACID原則は、データ整合性を維持し、大量データを管理するために重要です。
信頼性が高く一貫したデータベーストランザクションの基礎を理解する
データは非常に重要であると言っても過言ではありません。データは特に現代の組織にとって重要です。実際、The Economistは、データが石油を超えて世界で最も価値のある資源になったと述べていますが、それは2017年のことでした。
しかし、データに関する問題の一つは、毎日処理する必要がある膨大な量です。今日、世界中で生成されているデータは非常に多いため、私たちはその量を表現するために新しい用語を作り出さなければなりませんでした:ビッグデータ。確かに、これは最も印象的な用語ではありませんが、事実は変わりません。
このビッグデータが存在する中で、組織はそれを実用的、計算的、そしてセキュリティの観点から管理する方法を改善しようとしています。スパイダーマンのベンおじさんがかつて言ったように:
「大きな[データ]には大きな責任が伴う。」
ITの世界がデータ管理の複雑さを乗り越えるために作り出した最良の方法は、データベースを使用することです。
データベースとは何ですか?
データベースは、コンピュータ内に保存される構造化されたデータのセットです。しばしば、データベースはそのデータを処理するために特別に作られたコンピュータで満たされたサーバーファーム全体に保存されます。
現代のデータベースは非常に複雑なシステムであるため、それを管理するための管理システムが設計されています。これらのデータベース管理システム(DBMS)は、データベース内のデータの保存と取得を最適化し、管理することを目的としています。
ACIDアプローチは、組織が成功するデータベース管理に導くガイドの星の一つです。
ACIDトランザクションとは何ですか?
コンピュータサイエンスとデータベースの文脈において、ACIDは以下を意味します:
- 原子性
- 一貫性
- 分離性
- 耐久性
ACIDは、データベーストランザクションが信頼できるように処理されることを保証する原則のセットです。データベーストランザクションは、データベース内で行われる任意の操作であり、新しいレコードを作成したり、データを更新したりすることが含まれます。
ACIDトランザクションは、データが壊れないように注意して行う必要があるデータベース内の操作です。各データベースの変更にACID特性を適用することが、データの正確さと信頼性を維持する最良の方法です。
ACIDの完全な意味を理解するために、それぞれの要素を見てみましょう。
原子性
一貫性
分離性
耐久性
実践におけるACID特性
ACIDトランザクションのベストプラクティス
データベースのACID特性の文脈において、原子性とは、あなたが以下のいずれかを行うことを意味します:
- トランザクション全体をコミットする
- 全くトランザクションを行わない
本質的に、原子トランザクションは、あなたが行う任意のコミットが全体の操作を成功裏に完了することを保証します。操作の途中で接続が失われた場合、データベースはコミットが開始される前の状態にロールバックされます。
これは、クラッシュや停止が発生して、トランザクションが部分的に完了し、全体の状態が不明になるのを防ぐために重要です。原子性がないトランザクション中にクラッシュが発生した場合、トランザクションが中断される前にプロセスがどれだけ進んでいたかを正確に知ることはできません。原子トランザクションの原則を使用することで、トランザクション全体が成功裏に完了するか、または全く完了しないことを保証します。
ACIDデータベース管理において、一貫性はデータ整合性制約を維持することを指します。
一貫したトランザクションは、データベースのルールによって設けられた整合性制約を侵害しません。一貫性を強制することで、データベースが不正な状態に入った場合(データ整合性制約の違反が発生した場合)、プロセスは中止され、変更が以前の合法的な状態にロールバックされます。
トランザクションごとにデータベース内で一貫性を維持する別の方法は、データベースに置かれた宣言的制約を強制することです。
宣言的制約の例としては、すべての顧客アカウントが正の残高を持たなければならないことが挙げられます。トランザクションが顧客アカウントを負の残高にする場合、そのトランザクションはロールバックされます。これにより、変更がデータ整合性を維持することに成功するか、完全にキャンセルされることが保証されます。
分離されたトランザクションは「シリアライズ可能」と見なされ、すべてのACIDトランザクションが他のトランザクションが同時に発生することなく明確な順序で発生します。
データベース上で実行されるすべての読み取りまたは書き込みは、同じデータベース上で発生している他のトランザクションの読み取りおよび書き込みに影響されません。グローバルな順序が作成され、各トランザクションが次のトランザクションが始まる前に完全に完了することを保証するために行列に並びます。
重要なのは、これが二つの操作が同時に発生できないことを意味するわけではないということです。複数のトランザクションが同時に発生してもよいが、それらのトランザクションが同時に発生している他のトランザクションに影響を与える可能性がない限りです。
これを行うことで、トランザクションの速度に影響を与える可能性があり、多くの操作が開始を待たなければならない場合があります。しかし、このトレードオフは、分離によって提供される追加のデータセキュリティに見合うものです。
ACIDデータベースにおいて、分離は楽観的トランザクションと悲観的トランザクションと呼ばれる許可のスライディングスケールを使用して達成できます:
- 楽観的トランザクションスキーマは、他のトランザクションが同じ場所を二度読み書きせずに完了することを仮定します。 楽観的スキーマでは、トランザクションが同じ場所を二度ヒットした場合、両方のトランザクションが中止され、再試行されます。
- 悲観的トランザクションスキーマは、より少ない自由を提供し、リソースをロックダウンします。他のトランザクションが他のトランザクションに影響を与えると仮定します。 これにより、中止と再試行が少なくなりますが、トランザクションは楽観的トランザクションアプローチよりも頻繁に順番待ちを強いられることになります。
これら二つの理想の間で甘いスポットを見つけるのが、最も良い結果を得る場所です。
データベース管理におけるACIDアプローチの最後の側面は耐久性です。
耐久性は、成功裏にコミットされたデータベースに対する変更(トランザクション)が、システム障害が発生した場合でも永続的に生き残ることを保証します。これにより、データベース内のデータが以下の影響を受けないようにします:
- サービス停止
- クラッシュ
- その他の障害のケース
耐久性は、データベース(またはその一部)が再起動される際に参照される変更ログを使用することによって達成されます。
ACIDはデータ整合性とセキュリティを支援します
ACIDアプローチのすべての側面が成功裏に結集されると、データベースは最高のデータ整合性とデータセキュリティ を維持し、組織に継続的に価値を提供します。データが壊れたデータベースは、組織が日常業務や戦略的分析においてデータに対して大きな重視を置いているため、高価な問題を提示する可能性があります。
データベースにACID特性を使用することで、データベースが業務を通じて価値のあるデータを提供し続けることを保証します。
関係データベースにおけるACID
関係データベースなどの現実のアプリケーションでACID特性を使用することは、データ整合性を維持するために重要です。
SQL ServerはACID原則に完全に準拠しており、強力なデータ整合性を保証するのに理想的です。MySQLを使用する場合、ACID準拠はストレージエンジンに依存します。
noSQLデータベースにおけるACID
MongoDBは、ドキュメントを中心に設計されたNoSQLデータベースであり、もともとACID特性に基づいて設計されていませんでした。しかし、新しいバージョンではドキュメントレベルでACIDを組み込んでおり、データ整合性においてSQL Serverに近づきつつあります。
ACIDの指導原則を効果的に使用するには、以下のベストプラクティスに従ってください:
- 関連データをまとめて格納するようにデータをモデル化します。 これにより、不整合のリスクが低減し、スケーラビリティが促進され、より効率的なアクセスと更新効率がサポートされます。
- 長時間実行されるトランザクションを小さな部分に分けます。 短いトランザクションは、必要なリソースが少なくなります。
- トランザクションを1,000件のドキュメント修正に制限します。 これにより、システムは大きなデータボリュームを扱いながら、安定性とパフォーマンスを維持できます。
- データの整合性、システムパフォーマンス、および可用性のバランスをより良くするために、適切な読み取りおよび書き込みの懸念を設定します。
- 一時的なエラーにより失敗したトランザクションを処理し、再試行します。 これにより、失敗した操作の数が減少し、データ整合性を維持するためにより多くのACIDトランザクションが完全に完了します。
- 複数のシャードに影響を与えるトランザクションのパフォーマンスコストに注意してください。 レイテンシと潜在的な失敗を減らすために、関連するトランザクションを1つのシャードにローカライズすることを検討します。
- 無効なデータエントリを防止し、データがデータベースに到達する前に検証するための制約を使用してデータ整合性を強制します。
- データ損失を防ぐためにログとバックアップを使用します、頻繁にバックアップをスケジュールし、それらを徹底的にテストします。
関連する読み物
これらの投稿は私自身の意見であり、必ずしもBMCの立場、戦略、または意見を代表するものではありません。