【问题标题】:Check if row is deleted or not检查行是否被删除
【发布时间】:2014-05-22 21:22:47
【问题描述】:

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

【问题讨论】:

    标签: java cassandra cassandra-2.0


    【解决方案1】:

    删除是 Cassandra 是通过写入一个称为 tombstone 的新行来完成的。墓碑将确保在任何查询中都不会返回该行(墓碑已在所有节点上达到完全一致性)。

    当满足以下条件时,该行实际上从 SSTables 中删除:

    1. 发生压缩
    2. 表的 tombstone 记录早于 gc_grace_seconds(默认为 10 天)

    插入具有已存在键的行不会导致错误,因为 Cassandra 中的数据结构的行为与 Java Map 非常相似。 “放置”具有相同键的行只会覆盖插入中的列值,然后成功。

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

    我不确定您使用的是哪个客户端,但对于 C* 2.0,您应该使用 DataStax Java 驱动程序(当前版本是 2.0.2)。

    【讨论】:

    • 感谢您的回答!我了解墓碑的原理,以标记行以进行删除,稍后在契约中完成。但是,如果在实际从 SSTables 中删除该行之前使用相同的键重新插入该行,为什么不删除墓碑?
    • 如果删除后再次插入该行,则该行键的墓碑不再是该行键的最新“写入”,因此此时墓碑无关紧要。
    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多