DataStax/Cassandra 当新的时间戳值等于前一个时,使用时间戳的行为是不可预测的
DataStax/Cassandra USING TIMESTAMP behavior is unpredictable when a new timestamp value equals to previous one
Cassandra 中的这种行为似乎没有记录并且违反直觉。我想知道为什么会发生这种情况以及如何防止此类事情发生。
创建测试table。
CREATE TABLE test_table (id text PRIMARY KEY, foo text);
现在用 USING TIMESTAMP
在 table 中创建一行。
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
使用相同时间戳的情况下才会发生更新。
预期结果:
- 没有使用相同的时间戳进行更新
- 更新总是使用相同的时间戳
实际结果:
- 更新有时使用相同的时间戳
仅供参考,
我打开了一张票来获得你问题的答案。这是对可能尝试此操作的其他人的回应。同样,在典型情况下,人们不会做您正在做的事情。
---- 响应----
如您所知,DSE/Cassandra 通过写入时间戳处理冲突,最新的总是获胜。如果出现你思想实验中详述的平局,实际上有两种情况需要处理。
活细胞与墓碑相撞
在这种情况下,墓碑将永远获胜。无法知道这是否是客户所期望的,但行为将是一致的。
活细胞与另一个活细胞碰撞
与墓碑情况类似,我们无法知道应该返回哪个单元格。为了提供一致性,当写入时间戳相同时,值较大者获胜。
Cassandra 中的这种行为似乎没有记录并且违反直觉。我想知道为什么会发生这种情况以及如何防止此类事情发生。
创建测试table。
CREATE TABLE test_table (id text PRIMARY KEY, foo text);
现在用 USING TIMESTAMP
在 table 中创建一行。
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
使用相同时间戳的情况下才会发生更新。
预期结果:
- 没有使用相同的时间戳进行更新
- 更新总是使用相同的时间戳
实际结果:
- 更新有时使用相同的时间戳
仅供参考,
我打开了一张票来获得你问题的答案。这是对可能尝试此操作的其他人的回应。同样,在典型情况下,人们不会做您正在做的事情。
---- 响应----
如您所知,DSE/Cassandra 通过写入时间戳处理冲突,最新的总是获胜。如果出现你思想实验中详述的平局,实际上有两种情况需要处理。
活细胞与墓碑相撞 在这种情况下,墓碑将永远获胜。无法知道这是否是客户所期望的,但行为将是一致的。
活细胞与另一个活细胞碰撞 与墓碑情况类似,我们无法知道应该返回哪个单元格。为了提供一致性,当写入时间戳相同时,值较大者获胜。