Spring Boot学习三:事务管理

本文详细介绍了在SpringBoot中如何使用@Transactional注解进行事务控制,包括事务回滚的条件、如何自定义回滚异常类型以及如何确保事务在捕捉异常后的正确回滚。

前面我们已经配置好了JPA,那么为了保证数据的一致性,我们就要用到事务控制。
在springboot上使用事务其实很简单,就一个注解@Transactional,那么就来试试吧
首先写个方法

 	@RequestMapping("/save")
    @Transactional
    public void save(String name,Integer age) {
        User user = new User();
        user.setAge(age);
        user.setName(name);
        userRepository.save(user);
        throw new NullPointerException();
    }

接着去postman执行一下
在这里插入图片描述
去数据库看下有没有新增数据
在这里插入图片描述
没有新增数据说明事务回滚。我们也可以在类上直接添加注解,那么所有的方法都进行事务的管理。
其中Spring的默认的事务规则是遇到运行异常(RuntimeException及其子类)和程序错误(Error)才会进行事务回滚,当我们遇到SQLException(检测异常)时事务不回滚

@RequestMapping("/save")
    @Transactional
    public void save(String name,Integer age) throws SQLException {
        User user = new User();
        user.setAge(age);
        user.setName(name);
        userRepository.save(user);
        throw new SQLException("发生异常了!!!");
    }

在这里插入图片描述
在这里插入图片描述
数据添加了,说明事务没有回滚,那么我们可以使用rollbackOn属性,表示当该方法中抛出指定的异常时数据回滚

 @RequestMapping("/save")
    @Transactional(rollbackOn = Exception.class)
    public void save(String name,Integer age) throws SQLException {
        User user = new User();
        user.setAge(age);
        user.setName(name);
        userRepository.save(user);
        throw new SQLException("发生异常了!!!");
    }

执行一下
在这里插入图片描述
在这里插入图片描述
数据没有增加,说明回滚了
注解还有个属性叫dontRollbackOn,表示当该方法中抛出指定的异常时数据不回滚
还有在业务层捕捉异常后,发现事务不生效。例如

  @RequestMapping("/save")
    @Transactional(rollbackOn = Exception.class)
    public void save(String name,Integer age){
        User user = new User();
        user.setAge(age);
        user.setName(name);
        userRepository.save(user);
        try {
            throw new SQLException("发生异常了!!!");
        } catch (Exception e){
            e.printStackTrace();
        }
    }

执行一下
在这里插入图片描述
事务没有回滚,我们把异常统一抛出,例如

@RequestMapping("/save")
    @Transactional(rollbackOn = Exception.class)
    public void save(String name,Integer age) throws Exception {
        User user = new User();
        user.setAge(age);
        user.setName(name);
        userRepository.save(user);
        throw new SQLException("发生异常了!!!");
    }

这样事务就回滚了
参考资料:https://blog.youkuaiyun.com/cowbin2012/article/details/90751044
其中这里rollbackFor 属性没有了,改成了rollbackOn

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值