事务失效、AOP切入等同类调用方法问题解决

一、

切面问题:
在开发中会遇到,当在Service中定义了一个方法并且切入之后,从Controller里面调用该方法可以实现切入,但是当在同一个Service中实现另一方法并调用改方法时却无法切入
例如同一个类中方法A,调用它的方法B,这时B方法是无法切入的。

事务问题:
同一个类中方法A没有事务,调用它的方法B,B有事务。这是事务失效。

其实原因很简单,Spring在扫描Bean的时候会自动为标注了@Transactional注解的类生成一个代理类(proxy),当有注解的方法被调用的时候,实际上是代理类调用的,代理类在调用之前会开启事务,执行事务的操作,但是同类中的方法互相调用,相当于this.B(),此时的B方法并非是代理类调用,而是直接通过原有的Bean直接调用,所以注解会失效。
切面也是同理。都是通过代理类执行的。 所有解决此问题就是通过获取代理类去调用方法B

二、这里有两种解决方案,建议使用方案二。

方案一:
通过AopContext.currentProxy()获取代理类,使用它时需要在启动类上设置@EnableAspectJAutoProxy(exposeProxy=true)注解,并exposeProxy设置为true

	public void saveUser(User user) {
        //获取代理类
        UserServiceImpl userService = (UserServiceImpl) AopContext.currentProxy();
        userService.test(user);
    }

    @Transactional
    public User test(User user) {
        User user1 = userRespository.save(user);
        int i = 1/0;
        return user1;
    }

方案二:
从spring容器中获取bean,通过bean调用。

	public void saveUser(User user) {
        //获取bean
        UserServiceImpl bean = applicationContext.getBean(UserServiceImpl.class);
        bean.test(user);
    }

    @Transactional
    public User test(User user) {
        User user1 = userRespository.save(user);
        int i = 1/0;
        return user1;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在同一个方法相互调用时,如果希望事务能够生效,可以采取以下解决办法: 1. 使用代理调用方法:由于Spring事务管理是通过AOP代理实现的,所以可以通过使用代理对象调用方法来触发事务管理。可以通过将方法调用委托给代理对象来确保事务的生效。 2. 将被调用方法抽取到另一个:将被调用方法抽取到另一个,并确保在被调用方法上添加@Transactional注解。这样,在调用方法调用被抽取的方法时,事务将能够生效。 3. 使用AspectJ模式的事务管理:Spring还提供了AspectJ模式的事务管理,可以在同一个方法相互调用时保持事务的生效。通过配置AspectJ的切面来实现事务的管理,可以细粒度地控制事务的传播行为和回滚条件。 需要注意的是,以上解决办法需要根据具体情况选择合适的方式,并确保在调用方法上正确地添加@Transactional注解。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring一个service方法相互调用事务不生效问题解决方案](https://blog.csdn.net/a1036645146/article/details/107469578)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值