我正在编写一个应用程序,我需要能够判断插入和更新是否成功。我正在使用" INSERT ...如果不是EXESTS"为了获得轻量级事务行为并注意到从execute返回的结果集,包含一个包含更新数据的行和一个" [applied]"可以查询的列。那样太好了。但是我有一个返回空ResultSet的更新语句。看起来好像更新成功,但我想用一种编程方式来验证。
澄清:
我已经对我的突变返回的结果集进行了一些记录。我发现" INSERT ... IF NOT EXIST" s返回一个带有名为" [applied]"的布尔列的ResultSet。如果" [应用]"如果是false,它也会返回已经退出的行。
使用UPDATE,我总是看到一个空的ResultSet。
所以我有两个问题:
答案 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完全复制之前,突变已在其他主机上完成。该变异仍然适用,但您无法知道实际受影响的行数。