Cassandra 2.0 documentation中关于原子性的段落如下:
例如,如果使用写一致性级别QUORUM和复制因子3,则Cassandra将向群集中的所有节点复制写入并等待来自两个节点的确认。如果写入在其中一个节点上失败但在另一个节点上成功,则Cassandra会报告无法在该节点上复制写入的失败。但是,在另一个节点上成功的复制写入不会自动回滚。
因此,写请求被发送到3个节点,我们正在等待2个ACK。假设我们只收到1个ACK(在超时之前)。那么很明显,如果我们使用一致性级别ONE进行读取,我们可以读取该值。
但以下哪种说法也是正确的:
- 可能发生的情况是,写入已经持久化在第二个节点上,但该节点的ACK丢失了?(注意:这可能导致在读一致性QUORUM的情况下读取该值!)
- 可能发生的情况是,写入稍后将持久化到第二个节点(例如由于暗示式转交)?(注意:这可能导致在读一致性QUORUM的情况下读取该值!)
- 不可能发生的情况是,写入已经持久化在第二个节点上,但通过ReadRepair最终从节点中删除了写入的值?
- 不可能发生的情况是,写入已经持久化在第二个节点上,但需要执行手动的“撤销”操作吗?