Cassandra:如何在轻量级事务中执行upsert

Cassandra: How to perform upsert in lightweight transaction

在Cassandra中,我想添加一行,如果它已经存在,只有当现有日期早于新日期时才更新它。这是如何完成的:

INSERT INTO tbl (...) VALUES (...) IF NOT EXISTS;

如果第一个查询不适用,我 运行 第二个:

UPDATE tbl SET ...
WHERE ...
IF date <= ?;

是否可以将两个查询合并为一个?也许使用 UPDATE 作为 upsert,同时保持 IF 条件。这些语句(超时)存在性能问题,因此这就是我要更改它的原因。

如果行不存在,定期更新(无 IF)也会执行插入,但轻量级事务不存在。也许也可以 "trick" 将其插入。

谢谢!

LWT 基本上是在执行数据变异之前进行检查。仅针对具有以下条件的 INSERT 和 UPDATE 启用条件执行: 1.如果插入不存在 2. IF column = 'value' for UPDATE

您不能将这些条件与不同的操作混合搭配。如果有一个选项说 UPDATE ... IF column <= 'value' 它将必须访问所有节点并向所有节点提出事务,这将对性能产生巨大影响。 LWT 通过仅命中副本节点即使在相等条件下也会影响性能。