Spring Data Cassandra 轻量级事物支持

琴献
2023-12-01

Spring Data Cassandra 轻量级事务支持

做数据操作不得不提的就是数据操作的事务性,如果控制不好就很容易将数据写脏,这往往是初学者容易犯大忌的地方。我们来看一下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。

参考代码

Spring Data Cassandra 单元测试

 类似资料: