Spring 声明式事务 @Transactional(基本使用)

本文详细介绍了声明式事务在Spring框架中的使用,包括自动开启事务、正常提交、异常时自动回滚、手动控制回滚以及异常分类对事务影响的讨论。
摘要由CSDN通过智能技术生成

概述

        声明式事务的实现很简单,只需要在需要事务的⽅法上添加 @Transactional 注解就可以实现了.⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了 没有处理的异常会⾃动回滚事务.

@Transactional 的基本使用

        废话不多说,直接看代码实现,可以更直观的学习

        代码没有截取全,只截取了最核心的代码,其中 userService 对象调用 insertUser 方法可以向数据库中插入数据,知道这个即可

1.创建事务的方法没有抛出异常的情况

        在 registry() 方法前添加 @Transactional 注解,为方法创建事务

         registry() 方法中的代码都正常运行,没有抛出错误,此时事务正常提交

@Transactional
    @RequestMapping("/registry")
    public String registry(String userName,String password){
        //事务执行的内容
        Integer result=userService.insertUser(userName,password);
        log.info("成功插入"+result+"条数据");
        return "注册成功";
    }

        如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作

2.创建事务的方法抛出异常的情况

          registry1() 方法中 int a=10/0; 这行代码是错误的,所以方法  registry1() 会抛出错误,此时事务就会自动进行回滚

    @Transactional
    @RequestMapping("/registry1")
    public String registry1(String userName,String password){
        //事务执行的内容
        Integer result=userService.insertUser(userName,password);
        log.info("成功插入"+result+"条数据");
        int a=10/0;
        return "注册成功";
    }

        如下是事务执行完后的日志,可以看出有deregistering(销毁事务),closing(关闭事务)等操作

3.创建事务的方法中出现了错误,但错误被捕获的情况

        registry2() 方法中 int a=10/0; 这行代码是错误的,但是错误被捕获并进行了处理,此时方法registry2() 就不会向外抛出错误,那么事务就不会回滚,而是自动提交

        通过这里我们可以看出,事务是以方法为一个整体,并不关心方法中执行的程序有没有错误,只关心方法有没有抛出错误,方法没有抛出错误就自动提交,抛出错误就回滚但不是所有的错误都回滚,后面会举例

@Transactional
    @RequestMapping("/registry2")
    public String registry2(String userName,String password){
        //事务执行的内容
        Integer result=userService.insertUser(userName,password);
        log.info("成功插入"+result+"条数据");
        try {
            int a=10/0;
        }catch(Exception e){
            log.info("发生错误");
        }
        return "注册成功";
    }

        如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作

4.手动回滚事务

        上述事务的提交和回滚都是自动的,当然也可以手动的进行回滚

        使⽤ TransactionAspectSupport.currentTransactionStatus() 得到当前的事务,并调用 setRollbackOnly() 进行回滚

@Transactional
    @RequestMapping("/registry3")
    public String registry3(String userName,String password){
        //事务执行的内容
        Integer result=userService.insertUser(userName,password);
        log.info("成功插入"+result+"条数据");
        try {
            int a=10/0;
        }catch(Exception e){
            //手动回滚事务
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return "注册成功";
    }

        如下是事务执行完后的日志,可以看出有deregistering(销毁事务),closing(关闭事务)等操作

5.方法抛出的异常不是 RuntimeException 和 Error 的情况

        上面的例子中有提到,不是所有的错误被抛出都会回滚,实际上,默认情况下只有抛出RuntimeException 以及它的子类或 Error 的错误才会回滚

        如下代码,手动抛出了一个 IOException() 异常,IOException() 异常不属于 RuntimeException 的子类,所以事务不会回滚,会直接提交

 @Transactional
    @RequestMapping("/registry4")
    public String registry4(String userName,String password) throws IOException {
        //事务执行的内容
        Integer result=userService.insertUser(userName,password);
        log.info("成功插入"+result+"条数据");
        try {
            int a=10/0;
        }catch(Exception e){
            throw new IOException();
        }
        return "注册成功";
    }

        如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作

部分异常的分类如下

  • 29
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小林想被监督学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值