Transaciton 注解 使用事项

Transaciton  注解会自动为我们开启一个事务。但某些情况下,总会出现事务开启不成功,这里我们做一个总结。

transaction 注解原理:spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。

注意事项:1 transaction  使用的是CGLB代理,也就是说,会为bean生成子类,因此@transaction 注解必须是在类或类的方法上。

2 :由于要为子类方法生成代理,所以该方法必须是可以继承的,因此像final,static,private 修饰的方法是绝对不行的,鉴于此,spring只支持对public 方法开启事务。

3 : 当 a 方法调用 b 方法时,b方法上有注解,此时不会产生事务。这是由于调用b方法的this不是代理类,调用的b方法自然不是代理类中有事务的方法。

总结:只要是以代理方式实现的声明式事务,无论是JDK动态代理,还是CGLIB直接写字节码生成代理,都只有public方法上的事务注解才起作用。而且必须在代理类外部调用才行,如果直接在目标类里面调用,事务照样不起作用。

猜你喜欢

转载自blog.csdn.net/qq_39158142/article/details/88308642