【发布时间】:2015-02-01 12:41:24
【问题描述】:
Cassandra 中的这种行为似乎违反直觉,我想知道为什么会发生这种情况,并可能解决这个问题。
假设我有一个包含三列的表:pk、主键、text 类型、foo、bigint 和bar,另一个text。
insert into keyspace.table (pk, foo, bar) values ('first', 1, 'test') using ttl 60;
这会在我的表中创建一个生存时间为 60 秒的行。看了一下,是这样的:
pk | foo | bar
------------------
first | 1 | test
现在我做:
update keyspace.table using ttl 10 set bar='change' where pk='first';
然后,观察这一行,我看到它发生了以下变化:
pk | foo | bar
--------------------
first | 1 | change
first | 1 | <<null>> // after 10 seconds
<< deleted >> // after the initial 60 seconds
一切顺利。我想要的是 bar 的生存时间改变,但没有别的,尤其是主键。这种行为是意料之中的。
然而,如果我的更新中没有ttl,或者它被设置为0:
update keyspace.table set bar='change' where pk='first';
然后我会随着时间的推移看到这种行为。
pk | foo | bar
--------------------
first | 1 | change
first | 0 | change // after the initial 60 seconds
换句话说,该行永远不会被删除。 foo 没有改变,所以它的生存时间仍然有效,在它通过后,值被删除(设置为 0)。但是pk 的生存时间确实发生了变化。这完全出乎意料。
为什么只有在我没有在更新中指定生存时间的情况下,主键的生存时间才会改变?我该如何解决这个问题,以便只有在我明确表示要这样做的情况下,主键的生存时间才会改变?
编辑我还发现,如果我使用高于初始值的生存时间,它似乎也会改变主键的生存时间。
update keyspace.table using ttl 70 set bar='change' where pk='first';
pk | foo | bar
--------------------
first | 1 | change
first | 0 | change // after the initial 60 seconds
<< deleted >> // after the 70 seconds
【问题讨论】:
标签: cassandra cql cassandra-2.0 cql3 ttl