@Transactional self-invocation (in effect, a method within the target object calling another method

IDEA提示信息

@Transactional self-invocation (in effect, a method within the target object calling another method of the target object) does not lead to an actual transaction at runtime

代码示例

@Service
public class TransactionalDemo {

    @Transactional
    public void aaa() {
        System.out.println("调用a方法");
    }

    public void bbb() {
        System.out.println("调用b方法");
        aaa();
    }
}

写完这个代码之后,可以看到aaa()方法下有黄色的波浪线,将鼠标放上去提示开始的信息。警告我们这样使用@Transactional注解是不会生效的。

原因

Spring的事务是通过AOP来实现的,只有通过代理对象调用@Transactional注解的对象方法时,事务才会生效,也就是直接调用aaa()方法事务才会生效,调用bbb()方法后间接调用aaa()方法事务是不会生效的。因为这次调用并不是通过代理对象来实现的。

解决方案

可以将aaa()方法重新写到一个类中,然后在bbb()方法中调用

@Service
public class AAADemo {
    @Transactional
    public void aaa() {
        System.out.println("调用a方法");
    }
}
@Service
public class TransactionalDemo {

    @Autowired
    private AAADemo aaaDemo;

    public void bbb() {
        System.out.println("调用b方法");
        aaaDemo.aaa();
    }
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值