本地事务失效问题

同一个对象内事务方法互调默认失效,原因是绕过了代理对象,事务使用代理对象来控制的

解决:使用代理对象来调用事务方法

1)、引入aop-starter(因为此依赖引入了aspectj依赖)

 <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
 </dependency>

2)、@EnableAspectJAutoProxy(exposeProxy = true)

//开启aspectj动态代理功能。以后所有的动态代理都是aspectj创建的(即使没有接口也可以创建动态代理,对外暴露代理对象)。注:jdk动态代理必须有接口

3)、AopContext.currentProxy()

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.aop.framework.AopContext;


@SpringBootTest
 class MallOrderApplicationTests {
      @Transactional(timeout = 30)
    public void a(){
        //b,c做任何设置都没用。都是和a公用一个事务
//        this.b();
//        this.c();
        //如果a,b不在同一个类里
//        bService.b();//a事务
//        aService.a();//新事物(不会滚)
        //但此时a,b都在同一个类里,我们可以用aop-starter依赖
        MallOrderApplicationTests test=(MallOrderApplicationTests)AopContext.currentProxy();
        test.b();
        test.c();
        int i=10/0;
    }
    @Transactional(propagation = Propagation.REQUIRED,timeout = 10)
    public void b(){}
    @Transactional(propagation = Propagation.REQUIRES_NEW,timeout = 20)
    public void c(){}

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值