【问题标题】:Cassandra: How to know if operation was insert or updateCassandra:如何知道操作是插入还是更新
【发布时间】:2016-04-13 10:00:19
【问题描述】:

为了尽量减少查询次数,我在我的应用程序中只使用了 UPDATE 方法:

UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ?

如果具有对应主键 d1,d2,d3 的行不存在,则会自动创建它,这就是我想要的。

但我还想知道该行是否已插入或更新。我在cassandra documentation 中阅读了有关 IF EXIST 和“应用”结果的信息。然而这个:

UPDATE lp_registry.domain SET dr = ?, ud = dateOf(now()) WHERE d1 = ? AND d2 = ? AND d3 = ? IF EXISTS

如果该行不存在,则不会执行操作。

有没有什么方法可以在没有 (SELECT 和 (INSERT or UPDATE)) 的情况下执行 UPSERT 并跟踪行的插入或更新?

【问题讨论】:

    标签: cassandra insert-update


    【解决方案1】:

    您的问题令人困惑,标题说要知道操作。 详细地说,您需要可用于插入或更新的统一查询。

    在 cassandra 中更新和插入是一样的。

    只需每次(所有列)都使用全行(所有列)触发插入查询,如果存在,它将根据主键进行更新。

    如果不存在,则插入。

    【讨论】:

      【解决方案2】:

      您的问题的答案是否定的,您无法确定写入是执行了新的插入行还是更新了现有行。正如您所注意到的,您可以自己通过执行 read-before-write 来做到这一点,但是您已经在每次写入时引入了性能损失。

      按照设计,Cassandra 执行 Upsert。这种性能优化允许 Cassandra DB 引擎写入数据而无需检查(读取)数据是否已存在。

      If EXISTS 是轻量级交易LWT 的一种形式。它们通常用于乐观并发控制,并且由于隐含的 read-before-write 而增加了延迟(最多四倍)。

      【讨论】:

        猜你喜欢
        • 2014-05-09
        • 1970-01-01
        • 2012-09-24
        • 2010-10-18
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        相关资源
        最近更新 更多