确保事务方法不会传播到只读事务方法的最佳方法是什么

问题描述 投票:0回答:1

我目前面临同一个 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% 想要只读事务上下文的更新是否太过分了?

感谢您的见解。


java spring-boot hibernate jpa spring-transactions
1个回答
0
投票

你必须放

@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public Optional<SomeEntity> readSomeEntity(string idEntity) {
   return this.someEntityRepository.findById(idEntity);
}

不太可能在单独的豆中。我认为在同一个类中调用的事务方法根本不使用代理。

无论如何,我看不出这样做有什么好处。为什么不在其他方法中直接保存实体?

© www.soinside.com 2019 - 2024. All rights reserved.