CAP定理によれば、分散コンピュータシステムが一貫性、可用性、およびパーティション許容度を同時に提供することは不可能です。
RavenDBについて読むと、このデータベースはACIDトランザクションとシャーディングを同時にサポートしているようです。RavenDBはどのようにそれを達成しますか?
前もって物事を明確にするために:
デフォルトでは、呼び出し間のRavenDBセッションでのすべての書き込み.SaveChanges()
は全か無かの法則です。何らかの理由で1つの操作が失敗した場合、現在のセッションでのすべての変更/最後の保存以降は破棄されます。この機能は、オンになっている楽観的同時実行性と組み合わせて、非常に強力です。より長いトランザクションが必要な場合は、System.Transactionもサポートされており、期待どおりに機能します。
シャーディングに関して:シャーディングされたセットアップでは、分散トランザクションの真の
サポート
はありません。ただし、適切なシャーディング戦略では参照ドキュメントが局所的であるため、各ストアでトランザクション書き込みを行うことができます。それらは、シャードがまったくない場合と同じように機能します。
CouchDBは同じボートにあります:それらは「ACID」(単一ノードから見た場合)ですが、一貫性がありません(CAPから見た場合)。データベースの用語は混乱を招く可能性があります。
PSあなたがリンクした「可用性」はCAPのAではありません。CAPのAは、「クエリを受け入れることができるすべてのノード」を表します。たとえば、パーティションの間、PAXOSはマジョリティパーティションのクエリにのみ応答しますが、マイノリティパーティションはクエリへの応答を拒否します。
ただし、可用性の観点から見ると、システムがダウンするよりも可用性が高くなっています。システムに整合性が必要な場合、これは達成できる最高の可用性です。