在类和方法上定义@Transactional有什么区别案例1案例2

案例1

@Transactional
public class UserServiceImpl implements UserService {

    ...................
    public void method1(){
        try{
            method2();
        }catch(Exception e){

        }
    }
    public void method2(){

    }
}

案例2

public class UserServiceImpl implements UserService {

    ...................
    public void method1(){
        try{
            method2();
        }catch(Exception e){

        }
    }
    @Transactional
    public void method2(){

    }
}

在 case1 中,如果发生任何异常,它正在回滚,但在 case 2 中,它不起作用。如果我遵循案例1,是否有任何性能问题?


答案 1

在案例1中,@Transactional应用于每个公共个人方法。私有和受保护的方法被Spring忽略。

Spring将类级注释应用于该类的所有公共方法,我们没有用@Transactional注释。但是,如果我们将注释放在私有或受保护的方法上,Spring将忽略它而不会出现错误。

在案例 2 中,@Transactional仅适用于方法 2(),不适用于方法 1()

情况 1: - 调用 method1() ->启动事务。当 method1() 调用 method2() 时,不会启动任何新事务,因为已经有一个

情况 2: - 调用 method1() ->不启动任何事务。当 method1() 调用 method2() 时,不会启动任何新事务。这是因为从同一类中调用方法时,@Transactional不起作用。如果您从另一个类调用 method2(), 它将起作用。

弹簧参考手册

在代理模式(这是默认设置)中,仅拦截通过代理传入的外部方法调用。这意味着,实际上,即使调用的方法标有@Transactional,自调用(实际上,目标对象内的方法调用目标对象的另一个方法)也不会在运行时导致实际的事务。此外,代理必须完全初始化以提供预期的行为,因此您不应在初始化代码中依赖此功能,即@PostConstruct。


答案 2

@Transactional上的类适用于服务上的每个方法。这是一条捷径。通常,如果您知道所有方法都将访问存储库层,则可以在服务类上进行设置。然后,可以使用在模型中执行更改的方法覆盖该行为。1) 和 2) 之间的性能问题未知。@Transactional(readOnly = true)@Transactional


推荐