Spring事务

注解事务使用,平常项目中使用事务也比较多。

@Transactional工作原理

  • @Transactional是基于AOP实现的,AOP又是使用动态代理实现的。如果目标对象实现了接口,默认情况下会采用JDK的动态代理,如果目标对象没有实现了接口,会使用CGLIB动态代理。@Transactional在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇到了异常,则回滚事务。

事务回滚失效解决方案

1.直接抛出异常

@Transactional(propagation = Propagation.REQUIRED) // 开启事务
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影响的行数:"+result);
        try {
            int num = 10/0;
        }catch (Exception e){
            result = 0;
            e.printStackTrace();
            throw e;//解决事务失效的问题
           // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return result;
    }

2.在catch中使用代码手动进行事务的回滚操作

@Transactional(propagation = Propagation.REQUIRED) // 开启事务
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影响的行数:"+result);
        try {
            int num = 10/0;
        }catch (Exception e){
            result = 0;
            e.printStackTrace();
            //throw e;//解决事务失效的问题
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return result;
    }

Spring 声明事务

  • 只需要在方法上添加@Transactional注解就可以实现,无需手动开启和提交事务,如果中途发生异常就会自动回滚事务。
  • @Transactional既可以修饰方法也可以修饰类,修饰方法只能修饰public方法
  • 注意:@Transactional在异常被捕获的情况下,事务就不会自动回滚
@Transactional(isolation = Isolation.READ_COMMITTED) // 开启事务
    @RequestMapping("/insert")
    public int insert(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        return userService.add(userInfo);
    }

    @Transactional(isolation = Isolation.READ_COMMITTED) // 开启事务
    @RequestMapping("/insert2")
    public int insert2(){
        UserInfo userInfo = new UserInfo();
        userInfo.setName("AOP");
        userInfo.setPassword("123456");
        int result = userService.add(userInfo);
        System.out.println("MySQL影响的行数:"+result);
        int num = 10/0;
        return result;
    }

Transactional参数说明

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值