如何通过SpringBoot CassandraTemplate实现带轻量级事务的UPDATE操作
解决方案
Spring Data Cassandra 提供的 CassandraTemplate 完全支持轻量级事务(CAS 比较交换操作)的 IF 条件设置,你可以通过 UpdateOptions 的 ifCondition 方法传入自定义匹配条件实现需求。
完整实现代码
对应你给出的CQL示例,实现代码如下:
import org.springframework.data.cassandra.core.CassandraTemplate; import org.springframework.data.cassandra.core.query.Criteria; import org.springframework.data.cassandra.core.query.Filter; import org.springframework.data.cassandra.core.query.Query; import org.springframework.data.cassandra.core.query.Update; import org.springframework.data.cassandra.core.cql.WriteOptions; import com.datastax.oss.driver.api.core.ConsistencyLevel; import java.util.UUID; // 构造WHERE查询条件:lastname = 'WELTEN' and firstname = 'Bram' Query query = Query.query( Criteria.where("lastname").is("WELTEN") .and("firstname").is("Bram") ); // 构造SET更新内容:id = 15a116fc-b833-4da6-ab9a-4a3775750239 Update update = Update.update("id", UUID.fromString("15a116fc-b833-4da6-ab9a-4a3775750239")); // 构造轻量级事务IF条件:IF age = 18 Filter ifCondition = Filter.from(Criteria.where("age").is(18)); // 构建UpdateOptions添加IF条件 UpdateOptions updateOptions = UpdateOptions.builder() .consistencyLevel(ConsistencyLevel.QUORUM) .ifCondition(ifCondition) .build(); // 执行更新操作 EntityWriteResult<CyclistId> result = cassandraTemplate.update(query, update, updateOptions, CyclistId.class); // 获取轻量级事务执行结果:true为条件匹配更新成功,false为条件不匹配未执行更新 boolean isUpdateSuccess = result.wasApplied();
注意事项
- 多IF条件可传入多个Criteria实例:例如要实现
IF age = 18 AND city = 'Amsterdam',可写为Filter.from(Criteria.where("age").is(18), Criteria.where("city").is("Amsterdam")) - 轻量级事务执行不会因为条件不匹配抛出异常,必须通过
wasApplied()方法判断是否更新成功 - 删除操作的轻量级事务也可以使用相同逻辑,在
DeleteOptions中调用ifCondition方法设置匹配条件即可
内容的提问来源于stack exchange,提问作者PraveenKumar K G
相关产品推荐
相关产品推荐

