根据CAP 定理,分布式计算机系统不可能同时提供一致性、可用性和分区容错性。
阅读有关RavenDB 的信息,看起来这个数据库同时支持 ACID 事务和分片。RavenDB 如何做到这一点?
预先澄清事情:
默认情况下,调用之间的 RavenDB 会话中的所有写入.SaveChanges()
都是全有或全无。如果一个操作由于某种原因失败,则当前会话中/自上次保存以来的所有更改都将被丢弃。这个特性,结合开启的乐观并发,非常强大。如果您需要更长的事务,则还支持 System.Transaction,并且可以按预期工作。
关于分片:分片
设置
中没有对分布式事务的真正支持。但是,由于参考文档在良好的分片策略中的局部性,您可以在每个存储上进行事务写入。它们的工作方式就像根本没有任何碎片一样。
CouchDB 在同一条船上:它们是“ACID”(从单个节点查看时),但不是一致的(从 CAP 查看时)。数据库术语可能会令人困惑。
PS您链接到的“可用性”不是CAP中的A。CAP 中的 A 代表“所有能够接受查询的节点”。例如,在分区期间,PAXOS 只会回答多数分区中的查询,而少数分区将拒绝回答查询。
但是从可用性的角度来看,它的可用性比系统宕机要好。如果系统需要一致性,那么这是您可以实现的最高可用性。