2014-05-22 99 views
1

我目前正在开发cassandra源代码(2.0.4),我想知道如何使用类ColumnFamily中的方法isMarkedForDelete()。如果我用一个键插入一行,该方法返回false,如果我删除该行,则返回true。这就是我期望的方式;-)但是,这就是我想知道的,如果我再次使用相同的键插入一行,该方法仍然返回false,尽管该行不会被删除(因为它是一个具有相同键的新行)。看起来,删除并重新插入的行始终保持标志,如果它在过去被删除一次。我如何可靠地确定一行是否被删除? 在此先感谢!检查行是否被删除

回答

6

删除是卡桑德拉是通过写一个新的行被称为墓碑来完成的。逻辑删除将确保该行不会在任何查询中返回(其中一个逻辑删除已在所有节点上达到完全一致)。

该行实际上是从当以下的SSTables删除满意:

  1. 压实发生
  2. 墓碑记录比对表gc_grace_seconds旧的(默认为10天)

使用已存在的键插入行不会导致错误,因为Cassandra中的数据结构的行为非常像Java Map。使用相同的键“放入”一行只会覆盖插入的列值,并成功。

确定行是否已被删除的最佳方法是查询行并确保查询中未返回该行。

我不确定你正在使用哪个客户端,但是使用C * 2.0,你应该使用DataStax Java Driver(当前版本为2.0.2)。

+0

感谢您的回答!我理解墓碑的原则是为了标记一行删除,稍后在一个压缩文件中完成。但是为什么在从SSTables实际删除行之前,如果用相同的键重新插入行,逻辑删除不会被删除? – user3581199

+0

如果在删除行之后再次插入该行,则该行键的逻辑删除不再是该行键的最新“写入”,因此此时逻辑删除不相关。 –