Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有轻量级事务的Cassandra Datastax语句_Cassandra_Datastax - Fatal编程技术网

带有轻量级事务的Cassandra Datastax语句

带有轻量级事务的Cassandra Datastax语句,cassandra,datastax,Cassandra,Datastax,我在使用Datastax java驱动程序组合BatchStatement和轻量级事务时遇到困难 考虑以下几点: String batch = "BEGIN BATCH " + "Update mykeyspace.mytable set record_version = 102 where id = '" + id + "' if record_version = 101; " <additional batched statements> + "APPLY BATCH";

我在使用Datastax java驱动程序组合BatchStatement和轻量级事务时遇到困难

考虑以下几点:

String batch = 
"BEGIN BATCH " 
+ "Update mykeyspace.mytable set record_version = 102 where id = '" + id + "' if record_version = 101; 
" <additional batched statements>
+ "APPLY BATCH";

Row row = session.execute(batch).one();
if (! row.getBool("[applied]")) {
    throw new RuntimeException("Optimistic Lock Failure!");
}
String update = "Update mykeyspace.mytable set record_version = ? where id = ? if record_version = ?";
PreparedStatement pStmt = session.prepare(update);
BatchStatement batch = new BatchStatement();
batch.add(pStmt.bind(newVersion, id, recordVersion));

Row row = session.execute(batch).one();
if (! row.getBool("[applied]")) {
    throw new RuntimeException("Optimistic Lock Failure!");
}
字符串批处理=
“开始批处理”
+“更新mykeyspace.mytable set record_version=102,其中id=”“+id+”,如果record_version=101;
" 
+“批量应用”;
Row=session.execute(batch.one();
如果(!row.getBool(“[applied]”){
抛出新的RuntimeException(“乐观锁失败!”);
}
此函数按预期运行,并指示我的轻量级事务是否成功以及是否应用了我的批处理。一切都很好。但是,如果我使用BatchStatement尝试同样的事情,我会遇到几个问题:

--我的轻量级事务“if”子句被忽略,并且始终应用更新

--“Row”结果为null,因此无法执行最后一行。getBool(“[applied]”)检查

String update=“update mykeyspace.mytable set record_version=?其中id=?if record_version=?”;
PreparedStatement pStmt=getSession()。准备(更新);
BatchStatement batch=新的BatchStatement();
batch.add(newboundstatement(pStmt).bind(newVersion,id,oldVersion));

Row=session.execute(batch.one() 第二个代码片段在我看来并不正确(没有构造函数接受字符串,或者您错过了准备好的语句)

您是否可以尝试以下方法:

String batch = 
"BEGIN BATCH " 
+ "Update mykeyspace.mytable set record_version = 102 where id = '" + id + "' if record_version = 101; 
" <additional batched statements>
+ "APPLY BATCH";

Row row = session.execute(batch).one();
if (! row.getBool("[applied]")) {
    throw new RuntimeException("Optimistic Lock Failure!");
}
String update = "Update mykeyspace.mytable set record_version = ? where id = ? if record_version = ?";
PreparedStatement pStmt = session.prepare(update);
BatchStatement batch = new BatchStatement();
batch.add(pStmt.bind(newVersion, id, recordVersion));

Row row = session.execute(batch).one();
if (! row.getBool("[applied]")) {
    throw new RuntimeException("Optimistic Lock Failure!");
}

我遇到了同样的问题。我昨天打开了一张税务支持的票据,收到了以下答复:

当前不支持批处理中作为PreparedStatements的轻量级事务。这就是为什么你会遇到这个问题

在Cassandra的即时路线图中没有包含此功能

这意味着,取消预先准备好的声明将解决这个问题。我想自己试试,但还没有

[更新]

我一直在努力解决这个问题。根据前面的反馈,我假设限制是在条件更新中使用PreparedStatement

我尝试将代码更改为不使用PreparedStatement,但在使用包含RegularStatement而不是PreparedStatement的BatchStatement时,这仍然不起作用

BatchStatement batchStatement = new BatchStatement(); 
batchStatement.add(conditionalRegularStatement); 
session.executeQuery(batchStatement);
它们唯一有效的方法是使用包含批处理的原始查询字符串执行executeQuery

session.executeQuery("BEGIN BATCH " + conditionalRegularStatement.getQueryString() + " APPLY BATCH"); 
更新: 此问题已在C*2.0.9中修复


最新的DataStax企业版现在是2.0.11。如果您看到此问题==>升级

是的,我很抱歉——prepared语句的实例化不清楚,因为它是作为全局成员创建的,我没有在示例代码中演示这一点。基本上,我的原始代码完全按照您的建议执行,除了它还在PreparedStatement周围合并了一个BoundStatement包装器。我试着用一个简单的准备好的声明(无边界声明)来尝试你的建议,但发现了同样的问题。非常感谢你运行这个过去的数据库…尽管我认为他们的答案是非常不幸的。我认为这个用例对于轻量级事务的使用是相当重要的。看起来现在有一个错误提交:很好的发现!如果每次我告诉这里的人升级卡桑德拉是他们最好的计划时我都有一美元,我就不必工作了。