Cassandra Java Driver:如何报告插入,更新和删除结果?

时间:2014-01-15 20:47:58

标签: java cassandra cql3

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

澄清:

我已经对我的突变返回的结果集进行了一些记录。我发现" INSERT ... IF NOT EXIST" s返回一个带有名为" [applied]"的布尔列的ResultSet。如果" [应用]"如果是false,它也会返回已经退出的行。

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

所以我有两个问题:

  1. 对于每种类型的突变,ResultSet应包含哪些内容的文档?我没有在CQL文档或Java Driver文档中看到它。我甚至试过看其他语言集成' docs并没有找到任何有关突变的ResultSet内容的描述。
  2. 有没有办法找出UPDATE修改了多少行或删除了多少行?

4 个答案:

答案 0 :(得分:3)

在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进行读取和突变。这样您就不必担心以编程方式检查突变,因为它需要随后的读取。

答案 1 :(得分:3)

即使我遇到同样的问题。我发现的一件事(坏的黑客)是,如果更新或插入失败,结果集中的列定义不止一个,如果突变成功,列定义只包含一列,即#34;应用" 。问题是ResultSet不包含" applied"的值列是" true"如果突变成功并且"假"当事务阻止更改数据时。我现在在我的应用程序中使用这个hack但我不认为这是一个很好的解决方案,所以即使我正在寻找更好的解决方案。

答案 2 :(得分:3)

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

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

此处,ownerid是主要的主键。您可以使用相应的列名称。

答案 3 :(得分:1)

  

有没有办法找出UPDATE修改了多少行或删除了多少行?

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