TransactionAttributeType.NOT_SUPPORTED 对检索实体有意义吗?

Does TransactionAttributeType.NOT_SUPPORTED make sense for retrieving entities?

在每个数据库查找方法上使用 TransactionAttributeType.NOT_SUPPORTED 是否有意义?如果不执行更新,我不认为附加实体有什么意义。

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
pubic List<AnEntity> getListEntities(){
    TypedQuery<AnEntity> query = em.createNamedQuery("AnEntity.myQuery",AnEntity.class);
    return query.getResultList();
}

它是否仍然在缓存中?

使用 REQUIRED 事务传播似乎唯一有用的时候是需要更新时:

 @TransactionAttribute(TransactionAttributeType.REQUIRED)
 public void editPersonName(Integer id, String newName){
      AnEntity anEntity= em.find(AnEntity.class, id);
      anEntity.setName(newName);
 }

除此之外,我真的不明白这一点。

不,对只读查询使用 NOT_SUPPORTED 事务传播没有意义,但使用默认的 REQUIRED 事务传播很有意义。您还需要一个事务来读取数据。数据库总是使用事务,不管你指定与否。

使用显式事务允许您将多个语句分组到一个事务中,并且,如果您使用的是 Hibernate,则可以避免主动释放连接开销。

仅仅因为 JPA 允许您在没有事务的情况下执行读取查询,并不意味着您必须这样做。

当您想在当前事务范围之外执行服务方法时,NOT_SUPPORTED 模式很有用。例如,当您有根本不需要事务的方法(例如发送电子邮件)时,可以避免 starting/ending 事务上下文的开销。