如果您自己的读操作可能失败?

时间:2018-07-24 11:15:35

标签: cassandra eventual-consistency

我使用RL / WL = QUORUM并发送两个更新,在某些情况下,下一个SELECT是否有可能读取我的第一个更新?

CREATE TABLE aggr(
    id  int,
    mysum int,
    PRIMARY KEY(id)
)

INSERT INTO aggr(id, mysum) VALUES(1, 2)
INSERT INTO aggr(id, mysum) VALUES(1, 3)
SELECT mysum FROM aggr WHERE id=1 -- expect mysum=3 here, but is it a must?

根据here的判断,如果两个更新在同一时间戳内出现,甚至有可能丢失第二个更新的一部分。

如果我解决时间戳问题,是否可以确保我总是阅读上次写的内容?

2 个答案:

答案 0 :(得分:2)

否,假设您使用客户端单调时间戳记(当前默认值是过去的)。但是使用其他设置也是可能的。我在这里假设它是发布这两个写入的单个客户端。如果这2个插入来自两个不同的服务器,则这完全取决于它们的时间戳。

这是Java驱动程序3.x的默认设置,但是如果使用cassandra pre CQL3(2.0)版本,则您需要在查询中为它们提供USING TIMESTAMP,因为该协议不支持它。否则,两次写入可以转到不同的协调器,并且如果协调器之间存在时钟漂移,则可以认为第一个插入比第二个插入“新”。但是,使用客户端时间戳(如果使用新版本,则应该是驱动程序上的默认时间戳)。

答案 1 :(得分:0)

如果使用CL = QUORUM同步进行更新,则第二个更新将始终覆盖第一个更新。较低的一致性要求不能保证这一点。