hibernate - 当@Transactional 处于类级别时如何使用只读

标签 hibernate spring jakarta-ee

我在调用 DAO 方法的 service 类上使用 @Transactional 我想知道如何在特定服务方法上使用只读。
我是否必须在此服务方法上使用 readonly=true 定义额外的 @Transactional,还是有其他方法?

最佳答案

来自 Spring API here .

在评估方法的事务设置时,最派生的位置优先。在以下示例中,DefaultFooService 类在类级别上使用只读事务的设置进行注释,但同一类中 updateFoo(Foo) 方法上的 @Transactional 注释优先于定义的事务设置在类里面。

@Transactional(readOnly = true)
public class DefaultFooService implements FooService {

  public Foo getFoo(String fooName) {
    // do something
  }

  // these settings have precedence for this method
  @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
  public void updateFoo(Foo foo) {
    // do something
  }
}

@Transactional 注释是指定接口(interface)、类或方法必须具有事务语义的元数据;例如,“调用此方法时启动一个全新的只读事务,暂停任何现有事务”。默认的@Transactional设置如下:

传播设置为 PROPAGATION_REQUIRED。

隔离级别为 ISOLATION_DEFAULT。

事务是读/写的。

事务超时默认为底层事务系统的默认超时,如果不支持超时则为无。

任何 RuntimeException 都会触发回滚,而任何已检查的异常都不会。

关于hibernate - 当@Transactional 处于类级别时如何使用只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8604931/

相关文章:

oracle - 如何在 Hibernate Spring 中访问特定模式?

java - JPQL(HQL)在查询中使用Map类型的参数

spring - 调用init方法失败;嵌套异常是 java.lang.IllegalStateException : No query specified on getOne

java - cucumber 步 Spring Bean

java - Java for Google App Engine 和 Java EE 之间的核心区别是什么?

java - mysql事务数据库逻辑可以放在哪一层?

java - 制作一个 "TransactionAction"内部类

ExtJS 和 Spring 3.0 MVC 的 Javascript 测试框架

java - 单元测试: @Inject not injecting service

jakarta-ee - 如何下载适用于 tomcat 7 的 servlet 3 依赖项