【问题标题】:Cassandra: How to perform upsert in lightweight transactionCassandra:如何在轻量级事务中执行 upsert
【发布时间】:2016-04-19 20:55:39
【问题描述】:

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

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

如果第一个查询未应用,我将运行第二个查询:

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

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

如果行不存在,定期更新(没有 IF)也会执行插入,但轻量级事务不存在。也许也可以“欺骗”它进行插入。

谢谢!

【问题讨论】:

  • 如果行不存在,更新条件date &lt;= ?如何为真?
  • 我在想如果该行不存在,也许有一种方法可以“告诉”它进行更新;像 IF date
  • 无法保证在执行第一次插入和后续更新之间没有创建行。您确实需要使用单个 LWT 语句来实现原子性。
  • 我正在尝试使用单个语句,但我不知道如何实现。我只知道模拟交易的批次......但我更愿意将它减少到一个语句

标签: cassandra cassandra-2.0 upsert


【解决方案1】:

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

您不能将这些条件与不同的操作混合和匹配。如果有一个选项说 UPDATE ... IF column

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2022-01-08
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2016-10-06
    • 2019-01-12
    • 2014-09-19
    • 1970-01-01
    相关资源
    最近更新 更多