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

How to know affected rows in Cassandra(CQL)?

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

例如,如果我有这样的查询:

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

现在,当然,因为我传递了6个键,很明显有6行会受到影响。

但是,就像在 RDBMS 世界中一样,有没有办法知道 datastax-driver 中 update/delete 语句中受影响的行?

我读过 cassandra 没有对写操作给出反馈here

除了我在google.

上看不到关于这个话题的任何其他讨论

如果那不可能,我可以确定使用上面给出的查询类型,它将全部删除或无法全部删除吗?

在 Cassandra 中无法做到这一点,因为 Cassandra 中的写入、删除和更新模型基本相同。在所有这些情况下,都会将一个单元格添加到 table 中,其中包含新信息或有关删除的信息。这是在没有检查当前数据库状态的情况下完成的。

如果不检查其余副本并对行进行完全合并,则无法判断是否有任何操作会实际影响数据库的当前读取状态。

这导致了经常被引用的反模式 "Reading before a write." 在 Cassandra 中,您应该尽可能快地编写,如果您需要历史记录,请使用保存修改日志的数据结构,而不是只是目前的状态。

有一个选项可以使用 IF value THEN do other thing 的 CAS 语法进行这样的查询,但与正常写入相比,这是一个非常昂贵的操作,应谨慎使用。

在最终一致的世界中,您可以将这些操作视为正在保存删除请求,并根据请求的一致性级别,等待来自多个节点的确认该请求已被接受。然后将请求异步传递到其他节点。 由于不依赖于诸如外键之类的任何东西,因此如果集群成功接受了请求,则没有什么可以阻止数据被删除。

但是,有很多如果。例如,删除一致性级别为 1 的数据,成功被一个节点接受,随后立即发生节点硬故障,如果在故障前未复制,则可能导致该删除丢失。

另一个例子——在删除过程中,一个节点宕机了,并且宕机了很长一段时间,超过了gc_grace_period,也就是说,超过了删除墓碑所需的时间删除的数据。然后,如果这个节点恢复了,那么所有突然从集群的其余部分删除的所有数据,但不是从这个节点删除的,都会被带回集群。

因此,为了避免这些情况,并考虑操作成功和最终,cassandra 管理员需要实施一些措施,包括定期修复作业(以确保所有节点都是最新的)。应用程序还需要决定什么是更好的 - 以可能的数据丢失为代价的一致性级别 1 的更快性能与具有更高一致性级别但数据丢失可能性较小的较低性能。