【问题标题】:Cassandra Java Driver: How are insert, update, and delete results reported?Cassandra Java 驱动程序:如何报告插入、更新和删除结果?
【发布时间】:2014-02-04 12:55:50
【问题描述】:

我正在编写一个应用程序,我需要能够判断插入和更新是否成功。我正在使用“INSERT ... IF NOT EXISTS”来获取轻量级事务行为,并注意到从执行返回的结果集包含更新数据的行和可以查询的“[applied]”列。这太棒了。但我有一个返回空结果集的更新语句。看起来好像更新成功了,但我想要一种编程方式来验证它。

澄清:

我已经打开了一些由我的突变返回的结果集的日志记录。我发现“INSERT...IF NOT EXIST”返回一个带有名为“[applied]”的布尔列的 ResultSet。如果“[applied]”为假,它还返回已经存在的行。

使用 UPDATE,我总是看到一个空的 ResultSet。

所以我有两个问题:

  1. 关于 ResultSet 应包含的每种突变类型的文档在哪里?我没有在 CQL 文档或 Java 驱动程序文档中看到它。我什至尝试查看其他语言集成的文档,但没有找到任何关于突变的 ResultSet 内容的描述。
  2. 有什么方法可以查出有多少行被 UPDATE 修改或被 DELETE 删除?

【问题讨论】:

    标签: java cassandra cql3


    【解决方案1】:

    即使我也遇到同样的问题。我发现的一件事(虽然是一个糟糕的 hack)是如果更新或插入失败,结果集中的列定义不止一个,如果突变成功,列定义只包含一列,即 "applied" 。问题是 ResultSet 不包含“applied”列的值,如果突变成功,则为“true”,当事务阻止更改数据时为“false”。到目前为止,我在我的应用程序中使用了这个 hack,但我认为它不是一个好的解决方案,所以即使我也在寻找更好的解决方案。

    【讨论】:

    • 是的,这并不是真正的 hack,因为它似乎是 Cassandra 传达突变结果的唯一方式。我也在做同样的事情。我通过记录结果集的内容发现了这一点,我希望它是空的。我希望文档更清楚地说明这种行为。
    • Cassandra doc.:INSERT 以原子方式和隔离方式将一列或多列写入 Cassandra 表中的记录。不返回任何结果。
    【解决方案2】:

    在 Cassandra 中插入/更新/删除的行为相同,它们被称为突变。如果您的客户没有返回任何异常,那么突变就完成了。

    如果您担心突变调用的一致性,请添加更高级别的 USING CONSISTENCY。

    http://www.datastax.com/docs/1.0/references/cql/index http://www.datastax.com/docs/1.1/dml/data_consistency

    如果您追求良好的一致性,我建议对读取和突变使用 LOCAL_QUORUM。这样您就不必担心以编程方式检查突变,因为它需要后续读取。

    【讨论】:

    • 谢谢,这很有帮助,但不能解决真正的问题。我在问题中添加了一些信息以帮助澄清我的问题。
    • 当 Mutation 失败时 cassandra 返回什么?
    【解决方案3】:

    我用来确定INSERT 是否有效的一种解决方法是检查从ResultSet 返回的 ROW 数据:

    ResultSet rs = session.execute(bs);
    Row row = rs.one();
    boolean insertFailed = row.getColumnDefinitions().contains("ownerid");
    

    这里,ownerid 是主行键。您可以使用各自的列名。

    【讨论】:

      【解决方案4】:

      有什么方法可以知道有多少行被 UPDATE 修改或被 DELETE 删除?

      据我所知,不,因为 DELETE 或 UPDATE最终是一致的。具有一致性级别 ONE 或 LOCAL_ONE 的 INSERT 可能没有完全复制,并且在 INSERT 完全复制之前在其他主机上完成了突变。突变仍将适用,但您无法知道实际影响了多少行。

      【讨论】:

      • 是的,在过去的一年里,我学到了更多关于最终一致性的含义。不过谢谢
      猜你喜欢
      • 2020-03-30
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2016-08-04
      相关资源
      最近更新 更多