【问题标题】:Can't delete a row previously created with an upsert in Cassandra using Java无法删除以前使用 Java 在 Cassandra 中使用 upsert 创建的行
【发布时间】:2018-01-31 01:56:09
【问题描述】:

TL;DR 是我无法删除以前使用 Java 的 upsert 创建的行。

基本上我有这样一张桌子:

CREATE TABLE transactions (
key text PRIMARY KEY,
created_at timestamp
);

然后我执行:

String sql = "update transactions set created_at = toTimestamp(now()) where key = 'test' if created_at = null"; 
session.execute(sql)

正如预期的那样,该行已创建:

cqlsh:thingleme> SELECT * FROM  transactions ;

 key  | created_at
------+---------------------------------
 test | 2018-01-30 16:35:16.663000+0000

但是(这就是让我发疯的原因)如果我执行:

sql = "delete from transactions where key = 'test'"; 
ResultSet resultSet = session.execute(sql);

什么都没有发生。我的意思是:没有抛出异常,该行仍然存在!

其他一些奇怪的东西:

  • 如果我将 upsert 替换为普通插入,则删除有效
  • 如果我使用 cqlsh 直接运行 sql 代码(更新和删除),它可以工作
  • 如果我针对 EmbeddedCassandraService 运行此代码,它可以工作(这很糟糕,因为我的集成测试只是绿色!)

我的环境:

  • 卡桑德拉:3.11.1
  • datastax java 驱动:3.4.0
  • docker 镜像:cassandra:3.11.1

任何关于如何解决这个问题的想法/建议都非常感谢;-)

【问题讨论】:

    标签: java cassandra datastax-java-driver


    【解决方案1】:

    我认为您遇到的问题可能是由于混合了轻量级事务 (LWT) (update transactions set created_at = toTimestamp(now()) where key = 'test' if created_at = null) 和非 LWT (delete from transactions where key = 'test')。

    Cassandra 使用时间戳来确定最近应用的突变(删除、更新)。使用 LWT 时,时间戳分配与不使用 LWT 时不同:

    轻量级事务会阻止其他轻量级事务的发生,但不会阻止正常的读写操作发生。 轻量级事务使用不同于正常操作的时间戳机制,混合 LWT 和正常操作可能会导致错误。如果轻量级事务用于写入分区内的行,则只能使用轻量级事务来进行读写操作。

    来源:How do I accomplish lightweight transactions with linearizable consistency?

    更复杂的是,默认情况下,java 驱动程序使用客户端时间戳,这意味着写入时间戳由客户端而不是协调的 cassandra 节点确定。但是,当您使用 LWT 时,会绕过客户端时间戳。在您的情况下,除非您禁用客户端时间戳,否则您的非 LWT 查询将使用客户端时间戳,其中您的 LWT 查询使用由 cassandra 中的 paxos 逻辑分配的时间戳。在任何情况下,即使驱动程序没有分配客户端时间戳,这仍然可能是一个问题,因为在 C* 端,LWT 和非 LWT 的时间戳分配逻辑也不同。

    要解决此问题,您可以更改 delete 语句以包含 IF EXISTS,即:

    delete from transactions where key = 'test' if exists

    Similar issue from the java driver mailing list

    【讨论】:

    • 嘿,安迪,成功了!!!你做了我的一天......非常感谢! :-) 顺便说一句,我很难找出问题所在,因为嵌入式 cassandra 没有表现出这种行为......
    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 2023-03-14
    • 2020-12-11
    • 2017-05-18
    • 1970-01-01
    相关资源
    最近更新 更多