做数据操作不得不提的就是数据操作的事务性,如果控制不好就很容易将数据写脏,这往往是初学者容易犯大忌的地方。我们来看一下Spring Data Cassandra是如何给我们的数据操作增加轻量级事务支持的。
从Spring Data for Apache Cassandra 2.0开始,通过提供的两个类InsertOptions和UpdateOptions提供了轻量级事务的支持,也就是所谓的乐观锁支持。
只需要这样来配置对象
@Data
class VersionedPerson {
@Id String id;
@Version long version;
}
通过官网的单元测试代码不难发现,跟我们使用Spring Data访问数据的方法并无二异
@Test // DATACASS-576
public void shouldInsertNewVersionedEntity() {
when(cassandraOperations.insert(any(), any(InsertOptions.class))).thenReturn(writeResult);
CassandraPersistentEntity<?> entity = converter.getMappingContext().getRequiredPersistentEntity(VersionedPerson.class);
repository = new SimpleCassandraRepository<Object, String>(new MappingCassandraEntityInformation(entity, converter),
cassandraOperations);
VersionedPerson versionedPerson = new VersionedPerson();
repository.save(versionedPerson);
verify(cassandraOperations).insert(versionedPerson, InsertOptions.builder().withInsertNulls().build());
}
再来观察一下SimpleCassandraRepository.save()和insert()的实现,
private static final InsertOptions INSERT_NULLS = InsertOptions.builder().withInsertNulls().build();
/* (non-Javadoc)
* @see org.springframework.data.repository.CrudRepository#save(S)
*/
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null");
BasicCassandraPersistentEntity<?> persistentEntity = this.mappingContext.getPersistentEntity(entity.getClass());
if (persistentEntity != null && persistentEntity.hasVersionProperty()) {
if (!entityInformation.isNew(entity)) {
return this.operations.update(entity);
}
}
return this.operations.insert(entity, INSERT_NULLS).getEntity();
}
/* (non-Javadoc)
* @see org.springframework.data.cassandra.repository.TypedIdCassandraRepository#insert(java.lang.Object)
*/
@Override
public <S extends T> S insert(S entity) {
Assert.notNull(entity, "Entity must not be null");
return this.operations.insert(entity);
}
在我们的代码中只需要这样
VersionedPerson versionedPerson = new VersionedPerson();
repository.save(versionedPerson);
一个save方法即支持了insert,又支持了update。