首页 > 技术文章 > Spring 事务管理 《@Transactional 注解 失效问题的解决方案》

zhaiMaoDou 2020-08-11 23:36 原文

@Transactional 注解

  一般使用 Spring 的注解声明事务 @Transactional 需要注意以下3点要求:

  1、在需要事务管理的地方加@Transactional 事务注解,可以是类、类中的public方法、接口定义;

  2、被@Transactional 注解的类、接口、方法一定是 public 访问权限的。如果注解在 protected、private 上事务无法生效,同时也不会报错。

  3、需要在 Spring XML 配置文件中开启事《https://www.cnblogs.com/zhaiMaoDou/p/13493627.html

 

问题1:

  spring的@Transactional事务生效的一个前提是进行方法调用前经过拦截器TransactionInterceptor;

  Spring采用动态代理(AOP)实现对bean的管理和切片,它为每个class生成一个代理对象。在代理对象之间进行调用时,可以触发切面逻辑。而在同一个class中,方法B调用方法A,调用的是原对象的方法,而不通过代理对象。所以Spring无法拦截到这次调用,也就无法通过注解保证事务性了,所以,在同一个类中的方法调用,则不会被方法拦截器拦截到,因此事务不会起作用。例如:在同一个类中调用被声明的事务方法,如下

    

 

 

   

解决方法:

  1、可以将方法放入另一个类,并且该类通过spring注入,即符合了在对象之间调用的条件

  2、获取本对象的代理对象,再进行调用。

    1)Spring-content.xml上下文中,增加配置:<aop:aspectj-autoproxy expose-proxy=“true”/>

    2)在xxxServiceImpl中,用(xxxService)(AopContext.currentProxy()),获取到xxxService的代理类,再调用事务方法,强行经过代理类,激活事务切面。
   

 

 

 

 

参考文档:

同一个类中调用声明式事务的方法失效问题:https://blog.csdn.net/qq_30336433/article/details/83338835?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

推荐阅读