我目前面临同一个 Spring 服务的两种方法的问题,这是一个基本示例:
@Transactional(readOnly = true)
public Optional<SomeEntity> readSomeEntity(string idEntity) {
return this.someEntityRepository.findById(idEntity);
}
@Transactional
public Optional<SomeEntity> readOrCreateSomeEntity(SomeEntity entity) {
if (this.someEntityRepository.existsById(entityInfo.getId()) {
// How to make so that this call goes through the Spring Proxy and actually
// gets @Transactional(readOnly = true) applied ?
return this.readSomeEntity(entityId.getId());
}
else {
return Optional.of(this.someEntityRepository.save(entity));
}
}
如何真正确保在
@Transactional
的readOrCreateSomeEntity
(非只读)上下文中,readSomeEntity
的实际调用纯粹包装在只读事务上下文中?并且 readOrCreateSomeEntity
的事务上下文不会传播?
我在这里考虑了两个选择:
@Autowired MyService self
。但这是一个问题,因为它会导致循环引用和上下文实例化错误。 @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
,但它甚至不会被Spring处理,因为我没有通过代理调用readSomeEntity
方法!是否可以实现这一点,如果可以,是否只能通过自我引用来实现?
从纯粹的技术角度来看,我更希望
readSomeEntity
确实是 100% 只读的,因为嘿,这是一个只读方法,我不明白为什么 Spring 会将其非只读事务上下文传播到 read 子方法。 .我这样想是不是错了?
最后,我应该关心这个吗?强制要求此读取方法实际上不执行 100% 想要只读事务上下文的更新是否太过分了?
感谢您的见解。
你必须放
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public Optional<SomeEntity> readSomeEntity(string idEntity) {
return this.someEntityRepository.findById(idEntity);
}
不太可能在单独的豆中。我认为在同一个类中调用的事务方法根本不使用代理。
无论如何,我看不出这样做有什么好处。为什么不在其他方法中直接保存实体?