在我看来,我真的不明白Cassandra为什么不一致。它不能进行一致性更新,但我从未使用过需要更新的数据库模型,而是使用了一致版本插入(有时即使它们并不真正更新也被称为版本更新)。
此外,如果您使数据模型ACID,则Cassandra可以完全符合ACID。与使用数据库事务不同,以银行的方式执行交易。在那里,交易不是多个数据更改,而是实际的数据对象。
银行账户中没有存款。它们有交易,您的帐户当前状态是从交易计算出来的。这些交易不是数据库功能,而是数据模型的一部分。它们不需要立即对所有节点可用才能保持一致,因为它们是不可变的。
我还没有找到过使数据不可变无法解决一致性问题的情况。结合将交易作为不可变数据的数据模型的一部分(写一次读多次),满足了ACID要求。
原子性 - 交易作为唯一的不可变对象/行,成为原子性,无需任何复杂的数据库对象支持它。
一致性 - 可以在数据模型中设计数据库操作或事务,使其一致。实际上只需要它是不可变的(创建后永远不会更改)。
隔离性 - 不影响其他交易的事务应该是它自己的数据对象,因此是隔离的。
持久性 - 如果交易的不可变数据丢失,则相当于将数据库恢复到其先前状态。如果数据没有丢失,则处于其事务后状态。在任何情况下,都满足ACID的持久性要求。
确实有几件事无法在“银行”数据模型中实现。您的帐户信息不能具有具有固定金额的ACID行。虽然交易本身是ACID的,但这并不意味着依赖于它们的数据也可以是ACID的。这是因为所有交易可能尚未从所有节点可见。它们甚至可能在另一个银行的数据库中。因此,您的帐户余额无法实现ACID一致性,但只要所有重要数据具有ACID一致性,就没有理由要求它具有此类要求-而它确实具有。
我使用银行数据库作为示例,因为它经常被用作如何使用SQL事务进行帐户余额回滚的示例-实际实现中永远不会发生...因为银行交易必须支持异步多数据库交易,或者换句话说,跨银行交易。
您还可以将此与文件系统相关联。 Cassandra(例如)可以为您提供文件的不可变快照的一致视图。您不能保证拥有最新快照的视图-但是一个快照。通过这种方式,它使其与CVS / SVN或CODA一样一致。