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 通过仅命中副本节点即使在相等条件下也会影响性能。
在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 通过仅命中副本节点即使在相等条件下也会影响性能。