SpringBoot事务测试

SpringBoot事务测试:普通方法调用事务方法、事务方法调用事务方法


注:此篇文章只有测试、结果及处理方法,不讲理论
(因为我不会),完整代码会放在最后,有需要了解理论的参考其他大佬博文

首先在启动类中开启AOP事务:加注解即可

@EnableAspectJAutoProxy(exposeProxy = true)

普通方法调用事务方法

    @Autowired
    private FJCLDao fjclDao;
    
    @RequestMapping("/c")
    public void c() {
    	this.d();
    }

    @Transactional
    public void d() {
        FJCL fjcl = new FJCL();
        fjcl.setId("3");
        fjclDao.insert(fjcl); // 插入数据 用自己的即可
        int a = 4 / 0; // 手动异常
    }

注:调用普通方法c() ,此种调用方式会导致事务方法 d 事务失效,出现异常不会自动回滚。
解决方法:将

this.d();

修改为使用代理调用事务方法,然后在普通方法中调用事务方法,事务生效

((TestController)AopContext.currentProxy()).d(); // TestController为类名

事务方法调用事务方法

	@Transactional
    @RequestMapping("/a")
    public void a() {
        FJCL fjcl = new FJCL();
        fjcl.setId("1");
        fjclDao.insert(fjcl);
        this.b();
        int a = 4 / 0;
    }

    @Transactional
    public void b() {
        FJCL fjcl = new FJCL();
        fjcl.setId("2");
        fjclDao.insert(fjcl);
    }

注:上述方式使用事务方法a() 调用事务方法b() 结果是a 、b在同一个事务,a、b都插入不成功,即都会自动回滚。此时b()方法上用下面哪种都是一样的效果

@Transactional 或者 @Transactional(propagation = Propagation.REQUIRES_NEW)

这是一种需求:就是需要两个在一个事务中。
另一个需求:a()回滚,b()不回滚,参考下面方法

	@Transactional
    @RequestMapping("/a")
    public void a() {
        FJCL fjcl = new FJCL();
        fjcl.setId("1");
        fjclDao.insert(fjcl);        	  
        ((TestController)AopContext.currentProxy()).b();
        int a = 4 / 0;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void b() {
        FJCL fjcl = new FJCL();
        fjcl.setId("2");
        fjclDao.insert(fjcl);
    }

此时就实现了a()回滚,b()依然正常执行的需求,即a b 在两个事务中

完整代码:

/**
 * Description: SpringBoot事务测试
 * Author: WangConvey
 * Date: 2021/4/26/026 14:52
 * Version: 1.0
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private FJCLDao fjclDao;

    @Transactional
    @RequestMapping("/a")
    public void a() {
        FJCL fjcl = new FJCL();
        fjcl.setId("1");
        fjclDao.insert(fjcl);
        this.b();
//        ((TestController)AopContext.currentProxy()).b();
        int a = 4 / 0;
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void b() {
        FJCL fjcl = new FJCL();
        fjcl.setId("2");
        fjclDao.insert(fjcl);
    }

    @RequestMapping("/c")
    public void c() {
        ((TestController)AopContext.currentProxy()).d();
    }

    @Transactional
    public void d() {
        FJCL fjcl = new FJCL();
        fjcl.setId("3");
        fjclDao.insert(fjcl);
        int a = 4 / 0;
    }
}

到此结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值