無知な質問で申し訳ありませんが、ACID 準拠のデータベース サーバーを必要としないアプリケーションはどれでしょうか? 私は、ACID が常に「そこにある」SQL Server のバックグラウンドを持っており、現在、他の DBMS を調査していると思います。私が考えることができるほとんどすべてのアプリケーションは、原子性または分離のいずれかを必要とします。ありがとう!
5 に答える
他の答えが欠けているように見えるのは、ACIDの一般的に適用可能な代替手段は「何もない」ではなく、結果整合性(BASEと呼ばれることもある)と呼ばれるものであるということです。
人々がACIDセマンティクスが必要だと言うとき、少なくともドメイン/ビジネス要件の観点から、彼らが実際に意味するのは、単にデータの整合性です。彼らは、データが失われたり破損したりしないようにしたいと考えています。多くのNoSQLデータベースは依然としてこの保証を提供しており、異なる方法で独自の条件で提供しているだけです。
NoSQLまたはBASEデータベースを、単に「非ACIDデータベース」として扱う場合、SQLまたはACIDデータベースの安全でない代替手段として使用することは確かに可能です。十分な情報に基づいた意思決定を行うということは、大まかなトランザクションの不足を補い、ECの長所を活かすために、アプリケーションレベルで何をしなければならないかを理解することを意味します。一般的な手法は次のとおりです。
楽観的同時実行性。これは、トランザクション環境でのロックを最小限に抑えるためにすでに使用されています。
長時間実行されている操作が途中で失敗した場合に、成功するまで何度も何度も再試行できるなど、操作のべき等。
補償トランザクションを使用する長期的なトランザクション手法。分散システムではサガと呼ばれることが多く、複数の独立したトランザクションが何らかの相関識別子によってグループ化され、操作全体の状態が独立して追跡されます。多くの場合、これらは実際にsaga状態自体にACIDセマンティクスを使用しますが、これは2フェーズコミットよりもはるかに軽量です。
実際、分散システムでの作業に多くの時間を費やすと(個々のサブシステムのそれぞれでACIDセマンティクスが利用できるシステムであっても)、システム間の操作を管理するために使用されるこれらの同じ手法がたくさんあります。パフォーマンスを完全になくします(BizTalkとBPELを考えてください)。
ある程度の経験を積むと、実際には非常に理にかなっており、ACIDセマンティクスを適用するよりも簡単であることがよくあります。コンピューティングプロセスは実際のプロセスの単なるモデルであり、実際のプロセスは途中で失敗することがあります。フライトを予約しましたが、突然行けなくなりました。職業はなんですか?キャンセルします。多分あなたはあなたのお金を取り戻すかもしれません、多分あなたはそうしないかもしれません、あるいは多分それは中間の何かです-それらはあなたのビジネスルールです。または、予約を開始したものの、気が散ったり、脇に追いやられたり、電源が切れたりして、セッションがタイムアウトになった可能性があります。職業はなんですか?簡単です、最初からやり直します。
質問に正面から取り組むために、私はこう答えます:
次の場合にACIDセマンティクスが必要です。
複数のユーザーまたはプロセスが同時に同じデータを処理することを合理的に期待できます。
トランザクションが表示される順序は非常に重要です。
ユーザーに表示される古いデータを容認することはできません。
不完全なトランザクションには、かなりのコストおよび/または直接的なコストがかかります(たとえば、不均衡な合計が重大な結果をもたらす可能性がある金融システム)。
一方、次の場合はACIDセマンティクスは必要ありません。
ユーザーは自分の個人データに対してのみ更新を実行する傾向があるか、更新をまったく実行しません(追加するだけです)。
トランザクションの暗黙的な(ビジネス定義の)順序付けはありません。たとえば、2人の顧客が在庫の最後のアイテムをめぐって競合している場合、実際にそれを入手するのはあなたにとって重要ではありません。
ユーザーは一度に数秒または数分間同じ画面を表示する傾向があるため、とにかく古いデータを見ることになります(これは実際にはほとんどのアプリケーションを説明しています)。
不完全なトランザクションを単純に放棄することができます。それらをデータベースに一時的に、場合によっては永続的に配置しても、悪影響はありません。
肝心なのは、どこでも本当にACIDセマンティクスを必要とするアプリケーションはほとんどないということです。ただし、多くのアプリケーションでは、どこかでそれらが必要になります。多くの場合、saga状態やメッセージキューなどの孤立したポケットにあります。
次回、新しいアプリケーションや機能を設計するときは、アトミック/分離された「トランザクション」を、すべてを結び付けるための少し余分な状態を持つ非同期の「イベントのチェーン」としてモデル化できるかどうかを考えてみてください。一緒。答えが「いいえ」になる場合もありますが、答えが「はい」である頻度に驚かれるかもしれません。
すべての RDBMS 担当者が ACID がなければ空が落ちると考えているのはパラドックスですが、ほとんどの NoSQL 担当者は、「私のアプリケーションは ACID を使用するとより良くなる」などとは考えずに、喜んでエンド ユーザー アプリケーションをデプロイしてサポートします。Marc B の回答に反して、NoSQL データベースは、更新がランダムに失われたり、データがランダムに破損したりするデータベースではありません。主な違いは、NoSQL データベースでは、アトミック性や分離などの制限されたバージョンを使用できることですが、任意の複雑さのトランザクションを実装するには指数関数的な労力が必要になることです。
非 ACID データベースを使用して銀行システムを実装できない理由はありません。ほとんどの NoSQL データベースでは、システム内の合計金額が変化する可能性は 0% で、ある口座からお金を差し引いて別の口座に追加するマイクロトランザクションを使用できます。
この問題を実際の例で説明するために、アプリケーションについて説明します。私の会社は高校にソフトウェアを販売しており、主に時間割だけでなく、点呼、教師の欠勤/交代、遠足、部屋の予約の管理も行っています。当社のソフトウェアは、社内で開発された Mrjb (社内でのみ利用可能) と呼ばれる非 ACID データベース エンジンに基づいており、NoSQL データベースに典型的な制限があります。
エンド ユーザーに関連する ACID と NoSQL の違いの例として、2 人のユーザーがまったく同時に同じロールをマークしようとすると、最終結果がデータの組み合わせになる可能性が (非常に) わずかです。両方のユーザーから提出されました。ACID データベースは、最終結果がいずれかのユーザーのデータか他のユーザーのデータであるか、または場合によっては 1 人のユーザーの更新が失敗し、エラー メッセージがユーザーに返されることを保証します。
この場合、ユーザーは、個々の学生の「欠席」ステータスがすべて 1 人のユーザーの更新と一致しているのか、それとも両方が混在しているのか気にしないと思います。ユーザーの入力。この例は実際には発生しないはずです。発生した場合、どのユーザーを信じるかについて本質的に正解がない「競合状態」になります。
Mrjb データベースに関して、「対応する Family オブジェクトなしで Student オブジェクトが存在することを許可してはならない」などの制約を実装できるかどうかについて質問がありました。(「ACID」の「C」=一貫性)。実際、この制約を維持することができますし、維持しています。これはマイクロトランザクションのもう 1 つの例です。
もう 1 つの例は、毎日の時間割の基になっている定期的な学校の時間割 (通常は 2 週間周期) の新しいバージョンをアップロードする場合です。この更新トランザクションをアトミックにすることや、他のトランザクションをこの更新から分離して実行できるようにすることは難しいでしょう。したがって、基本的には、この主要なトランザクションが発生している間「世界を停止」するか (約 2 秒かかります)、または学生が更新前と更新後のデータの組み合わせを含む時刻表を印刷する可能性を許可するかのいずれかを選択できます (おそらく、これが発生する可能性のある 100 ミリ秒のウィンドウ)。「世界を止める」オプションはおそらくより良いオプションですが、実際には後者を使用します. 混在した時刻表は、更新前の時刻表よりも悪いと主張することができます。しかし、どちらの場合も、時間割が変更されたことを生徒に通知するプロセスを持つ学校に頼る必要があります。一貫した時間割であっても、期限切れの時間割で作業している生徒は大きな問題です。また、学生は通常、時間割をオンラインで表示します。この場合、問題は大幅に軽減されます。
また、 http://brainresource.comの「ファイル システム ベースの Blob データベース」を作成し、脳のスキャンを保存しました。これは重要なデータベースであり、ACID プロパティを持たないデータベースですが、対象に関する他のデータには RDBMS を使用しています。
記録のために、私たちの会社はここで説明されています: http://edval.com.au そして私たちの NoSql 技術はここで説明されています (技術として説明されています): http://www.edval.biz/memory-resident-programming-object -データベース 。この投稿がスパムであるという懸念があり、当社に問題を引き起こしましたが、(a) 問われている質問は理論的な用語だけでは答えられないため、実際の例が必要であり、(b) 差し控える必要があると主張したいと思います。製品またはデータベース技術に関する識別情報は適切ではありません。
ACID セマンティクスにはパフォーマンスの代償が伴います。非常に大量のデータを管理し、不定期の不一致を受け入れることができる場合 (つまり、送金していない場合) は、非 ACID ソリューション (ほとんどの NoSQL ソリューションなど) が望ましい場合があります。
http://www.schoonerinfotech.com/solutions/general/what_is_nosql
Facebook は、早い段階でこのトレードオフを行った有名企業の 1 つです。実際、彼らはデータ ニーズにより適したデータ ストアとしてCassandraを作成しましたが、Cassandra は明示的に ACID セマンティクスをサポートしていません。
NoSQL タイプのデータベースに基づくものは、何か (通常は速度) と引き換えに ACID 準拠を犠牲にしています。
Twitter、Facebook、Reddit、Digg など... すべて部分的に非酸性ベースです