SpringBoot 快速开启事务中 @Transaction注解不生效的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21508727/article/details/82705028

常见1:遇到非检测异常时,事务不开启,也无法回滚。

原因:因为Spring的默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚。如果想针对非检测异常进行事务回滚,可以在@Transactional 注解里使用rollbackFor 属性明确指定异常。

常见2: 在业务层捕捉异常后,发现事务不生效。

原因:在业务层手工捕捉并处理了异常(try..catch)等于把异常“吃”掉了,Spring自然不知道这里有错,更不会主动去回滚数据。推荐做法是在业务层统一抛出异常,然后在控制层统一处理。

常见 3 :注解到protected可见度的方法上,事务不生效

原因:@Transactional 注解应该只被应用到 public 可见度的方法上。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因 此请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

参考连接

http://stackoverflow.com/questions/15616710/spring-transactional-with-aspectj-is-totally-ignored

http://www.iflym.com/index.php/code/the-theory-about-spring-and-aspectj-pre.html


 


 

猜你喜欢

转载自blog.csdn.net/qq_21508727/article/details/82705028
今日推荐