Java [联合国]期待卡桑德拉“;“轻量级事务”;行为
下面是需要使用DataStax的Java驱动程序对Cassandra中的轻量级事务进行推理/解释的问题 我想要一个插入操作,只有在数据不存在时才能成功。若使用了子句,则实现此CQL的Java [联合国]期待卡桑德拉“;“轻量级事务”;行为,java,cassandra,cql,Java,Cassandra,Cql,下面是需要使用DataStax的Java驱动程序对Cassandra中的轻量级事务进行推理/解释的问题 我想要一个插入操作,只有在数据不存在时才能成功。若使用了子句,则实现此CQL的。代码如下: public boolean insert( String key, String value ) { String cql = QueryBuilder.insertInto( KEYSPACE, TABLE_NAME ) .ifNotExists()
。代码如下:
public boolean insert( String key, String value )
{
String cql = QueryBuilder.insertInto( KEYSPACE, TABLE_NAME )
.ifNotExists()
.value( COL_1, QueryBuilder.bindMarker() )
.value( COL_2, QueryBuilder.bindMarker() )
.toString();
Row row = session.execute( cql, key, value ).one();
return row.getBool( 0 ); // this is equivalent to row.getBool("applied")
}
public void delete( String key )
{
String cql = QueryBuilder.delete().from( KEYSPACE, TABLE_NAME )
.where( QueryBuilder.eq( COL_1, QueryBuilder.bindMarker() ) )
.toString();
session.execute( cql, key );
}
请注意,COL_1
是这里的主键,代码是取自工作环境的简化版本。现在,对于这个三元组的重复调用,可以预期以下行为:
delete("key");
insert("key", "value"); // returns true
insert("key", "value"); // returns false
是的,这是预期的结果,而事实正是如此但并非总是如此我们的单元测试有时由于一些未知的原因而失败-第二次插入返回true。我对此非常着迷,最终找到了解决方案——添加一个IF
子句来删除操作,删除了重复调用中所有意外的结果
现在我感兴趣的是,这一切背后的原因是什么。如果子句不充分,为什么在插入中使用CAS(比较和设置)技术?为什么在delete
操作中应该有IF
子句?您使用了什么样的插入/删除查询一致性级别?@shuty我想象一个基于.one()代码>语句。@shutty我没有明确指定一致性级别,所以它应该是默认的-ONE@Bazidelete withIF
子句看起来像什么?@MinhPham我在构建delete查询时使用了QueryBuilder
的ifExists()
。