vin*_*nit 3 timestamp cql cassandra datastax
Cassandra 中的这种行为似乎没有记录且违反直觉。我想知道为什么会发生这种情况以及如何预防此类事情。
创建一个测试表。
CREATE TABLE test_table (id text PRIMARY KEY, foo text);
Run Code Online (Sandbox Code Playgroud)
现在在表中创建一行USING TIMESTAMP。
INSERT INTO test_table (id, foo)
VALUES ('first', 'hello')
USING TIMESTAMP 1566912993048082;
Run Code Online (Sandbox Code Playgroud)
结果是
id | foo | writetime(foo)
-------+-------+------------------
first | hello | 1566912993048082
Run Code Online (Sandbox Code Playgroud)
现在让我们使用相同的时间戳更新该行。
id | foo | writetime(foo)
-------+-------+------------------
first | hello | 1566912993048082
Run Code Online (Sandbox Code Playgroud)
一切正常。
id | foo | writetime(foo)
-------+--------+------------------
first | hello2 | 1566912993048082
Run Code Online (Sandbox Code Playgroud)
让我们使用相同的时间戳再次更新该行。
INSERT INTO test_table (id, foo)
VALUES ('first', 'hello2')
USING TIMESTAMP 1566912993048082;
Run Code Online (Sandbox Code Playgroud)
!!!没有改变。
id | foo | writetime(foo)
-------+--------+------------------
first | hello2 | 1566912993048082
Run Code Online (Sandbox Code Playgroud)
再次更新同一行。
id | foo | writetime(foo)
-------+--------+------------------
first | hello2 | 1566912993048082
Run Code Online (Sandbox Code Playgroud)
!!!再次工作。
id | foo | writetime(foo)
-------+--------+------------------
first | hello3 | 1566912993048082
Run Code Online (Sandbox Code Playgroud)
似乎只有在old.foo < new.foo使用相同时间戳的情况下才会发生更新。
预期成绩:
实际结果:
供参考,
我开了一张票来获取您问题的答案。这是对其他可能尝试此操作的人的回应。再说一次,在典型情况下,人们不会做你正在做的事情。
- - 回复 - -
如您所知,DSE/Cassandra 通过写入时间戳来处理冲突,其中最新的总是获胜。如果出现思想实验中详述的平局,实际上需要处理两种情况。
活细胞与墓碑碰撞 在这种情况下,墓碑总是会获胜。无法知道这是否是客户所期望的,但行为将是一致的。
活细胞与另一个活细胞碰撞 与墓碑情况类似,我们无法知道应该返回哪个细胞。为了提供一致性,当写入时间戳相同时,较大的值获胜。
| 归档时间: |
|
| 查看次数: |
1136 次 |
| 最近记录: |