如何在Cassandra(CQL)中知道受影响的行数?

10

似乎没有直接的方法可以知道Cassandra中受更新和删除语句影响的行数。

例如,如果我有这样一个查询:

DELETE FROM xyztable WHERE PKEY IN (1,2,3,4,5,6);

现在,当然,由于我已经传递了6个键,很明显会影响到6行。

但是,就像在RDBMS世界中一样,在datastax-driver中是否有任何方法可以知道更新/删除语句中的受影响行?

我读过cassandra在写操作时不提供任何反馈 here

除此之外,我没有通过谷歌看到关于这个主题的其他讨论。

如果不可能,那么我能否确定使用上面给出的查询类型,它要么全部删除,要么全部保留不变?

2个回答

8
在最终一致性的世界中,您可以将这些操作视为保存删除请求,并根据请求的一致性级别等待多个节点的确认,以便该请求已被接受。然后异步地将请求传递给其他节点。由于没有像外键之类的任何依赖关系,因此如果集群成功接受了请求,则不应阻止数据被删除。
然而,有很多情况需要考虑。例如,使用一致性级别为1删除数据,成功被一个节点接受,随后立即出现节点硬件故障,如果在故障之前未复制删除,则可能会导致该删除的丢失。
另一个例子是,在删除期间,一个节点宕机,并且宕机时间显着超过gc_grace_period,即比删除数据所需的时间更长。然后,如果恢复此节点,则所有从集群的其余部分删除但尚未从此节点删除的数据将被重新引入到集群中。
因此,为了避免这些情况并将操作视为成功和最终,Cassandra管理员需要实施一些措施,包括定期修复作业(以确保所有节点都是最新的)。此外,应用程序需要决定什么更好-在可能发生数据丢失的情况下使用一致性级别为1以换取更快的性能,还是使用更高的一致性级别但具有更少可能性的数据丢失以换取较低的性能。

那么除了负面情况,我可以假设数据将被删除? - pinkpanther
2
是的——如果集群没有拒绝您的请求,它将成功执行。请记住,Cassandra 的运作原则是最后写入胜出,因此如果存在并发的删除/更新操作(更新是插入的同义词),则时间戳最晚的操作将获胜:) 这意味着保持所有节点上时钟同步非常重要。 - Roman Tumaykin

7
在Cassandra中,没有办法做到这一点,因为在Cassandra中,写入、删除和更新的模型基本相同。在所有这些情况下,都会向表中添加一个单元格,其中包含新信息或有关删除的信息。这是在不检查当前数据库状态的情况下完成的。
如果不检查其他副本并对行进行完全合并,则无法确定任何操作是否实际影响了数据库的当前读取状态。
这导致了常被引用的反模式“写之前读取”。在Cassandra中,您应该尽可能快地编写代码,并且如果需要历史记录,请使用保留修改日志的数据结构,而不仅仅是当前状态。
有一种方法可以执行此类查询,即使用CAS语法IF value THEN do other thing,但与普通写入相比,这是一种非常昂贵的操作,应该谨慎使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接