【问题标题】:Did Update Resulted in UPDATE OR INSERT更新是否导致更新或插入
【发布时间】:2017-07-21 18:24:58
【问题描述】:

卡桑德拉supports upsert for UPDATE。也就是说,如果更新语句中提供的键在表中不存在;它被暗示为插入。如果更新导致更新或插入,有没有办法从更新查询的返回代码中知道。我们更愿意在不从 Cassandra 额外读取的情况下检测到这一点。

我们有一个场景,我们有一个吞吐量非常高的应用程序,其中 99% 的事件导致插入,但非常小的块导致更新。更新后,我们希望执行一些额外的检查并触发一些。

【问题讨论】:

    标签: cassandra cql cqlengine


    【解决方案1】:

    您可以在更新语句的末尾添加 IF EXITS

    所以更新语句是:

    UPDATE person SET name = 'xxxxx' WHERE id = '16843158' IF exists;

    对于 table 人和 nameid 是列名。

    如果行退出,则返回 True,否则返回 False。使用它,您可以创建一个检查,然后“执行一些额外的检查并触发一些”。如果行没有退出,这也不会插入任何东西。

    请检查 true/false 是作为 Row 的列还是作为布尔值返回,因为我只在 cqlsh 中检查过。

    为 Java 说话。在 cqlsh 中显示为列输出。

    【讨论】:

    • 我认为如果 Cassandra 有一点相反的想法会对我们有所帮助。正如我所说,在我们的案例中,99% 的传入记录都会导致插入。和 1% 的更新。我们想让两者都做它该做的事情;更新或插入。但我只想知道在 upsert 执行之后到底发生了什么;更新或插入。
    • 好的!我明白你到底想要什么。我怀疑,你想要的存在于 Cassandra 本身的层面。您可能必须在您的应用程序级别拥有此功能。通过上面的查询,你可以知道更新是否成功或者是否需要插入(看穿的话)。在正常的 upsert 执行之后似乎没有任何办法来决定“实际发生了什么;更新或插入”。
    【解决方案2】:

    简短回答:所有 Cassandra 写入都是 upsert,它们不会也无法在写入前检查数据库的状态。

    更长的答案:知道是否设置了值需要从 Cassandra 读取,这意味着如果您想知道在 upsert 时是否存在某些内容,则意味着您最终必须在写入之前执行反模式读取。

    基本上所有需要这种状态信息的数据模型都需要承受性能损失。最好的办法是找出另一种构建代码的方法。如果您确实需要了解其中的区别,您可以尝试支持 Paxos(如果不存在样式请求),但要知道它们也是有代价的。

    【讨论】:

    • 无论如何我们都想更新或插入。我只是想找出一种方法来了解更新语句执行后是否导致更新或插入。
    • 你不知道
    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 2010-09-24
    • 2015-05-15
    • 1970-01-01
    • 2016-05-02
    • 2017-04-14
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多