首页 > 解决方案 > 当新的时间戳值等于前一个时间戳值时,DataStax/Cassandra 使用时间戳的行为是不可预测的

问题描述

Cassandra 中的这种行为似乎没有记录且违反直觉。我想知道为什么会发生这种情况以及如何防止此类事情发生。

创建一个测试表。

CREATE TABLE test_table (id text PRIMARY KEY, foo text);

现在用 . 在表中创建一行USING TIMESTAMP

INSERT INTO test_table (id, foo) 
VALUES ('first', 'hello') 
USING TIMESTAMP 1566912993048082;

结果是

 id    | foo   | writetime(foo)
-------+-------+------------------
 first | hello | 1566912993048082

现在让我们使用相同的时间戳更新行。

INSERT INTO test_table (id, foo) 
VALUES ('first', 'hello2') 
USING TIMESTAMP 1566912993048082;

一切正常。

 id    | foo    | writetime(foo)
-------+--------+------------------
 first | hello2 | 1566912993048082

让我们使用相同的时间戳再次更新该行。

INSERT INTO test_table (id, foo) 
VALUES ('first', 'hello1') 
USING TIMESTAMP 1566912993048082;

!!!没有改变。

 id    | foo    | writetime(foo)
-------+--------+------------------
 first | hello2 | 1566912993048082

再次更新同一行。

INSERT INTO test_table (id, foo) 
VALUES ('first', 'hello3') 
USING TIMESTAMP 1566912993048082;

!!!再次工作。

 id    | foo    | writetime(foo)
-------+--------+------------------
 first | hello3 | 1566912993048082

似乎只有在old.foo < new.foo使用相同时间戳的情况下才会发生更新。

预期成绩:

实际结果:

标签: cassandratimestampdatastaxcql

解决方案


供参考,

我开了一张票来回答你的问题。这是其他可能尝试此操作的人的回复。同样,在典型情况下,一个人不会做你正在做的事情。

- - 回复 - -

如您所知,DSE/Cassandra 通过写入时间戳处理冲突,其中最新的总是获胜。如果您的思想实验中详细说明了平局,实际上有两种情况需要处理。

活细胞与墓碑碰撞 在这种情况下,墓碑将永远获胜。没有办法知道这是否是客户所期望的,但行为将是一致的。

活细胞与另一个活细胞碰撞 与墓碑情况类似,我们无法知道应该返回哪个细胞。为了提供一致性,当写入时间戳相同时,较大的值获胜。


推荐阅读