【问题标题】:How to use readonly when @Transactional is on class level当@Transactional处于类级别时如何使用只读
【发布时间】:2012-01-26 03:45:56
【问题描述】:

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

【问题讨论】:

    标签: hibernate spring jakarta-ee


    【解决方案1】:

    来自 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 注解是指定接口、类或方法必须具有事务语义的元数据;例如,“在调用此方法时启动一个全新的只读事务,暂停任何现有事务”。默认@Transactional设置如下:

    传播设置为 PROPAGATION_REQUIRED。

    隔离级别为 ISOLATION_DEFAULT。

    事务是读/写的。

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

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

    【讨论】:

    • 当只使用@Transactional 而没有readonly 属性时,这是否意味着默认情况下readonly=false 还是什么?
    • 我已经用完整的默认值列表更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 2021-11-29
    • 2010-12-09
    相关资源
    最近更新 更多