zoukankan      html  css  js  c++  java
  • Springboot事务使用与回滚

    Springboot中事务的使用:

    1、启动类加上@EnableTransactionManagement注解,开启事务支持(其实默认是开启的)。

    2、在使用事务的public(只有public支持事务)方法(或者类-相当于该类的所有public方法都使用)加上@Transactional注解。

    在实际使用中一般是在service中使用@Transactional,那么对于controller->service流程中:

    如果controller未开启事务,service中开始了事务,service成功执行,controller在之后的运行中出现异常(错误),不会自动回滚。

    也就是说,只有在开启事务的方法中出现异常(默认只有非检测性异常才生效-RuntimeException )(错误-Error)才会自动回滚。

     如果想要对抛出的任何异常都进行自动回滚(而不是只针对RuntimeException),只需要在使用@Transactional(rollbackFor = Exception.class)即可

    开启事务的方法中事务回滚的情况:

    ①未发现的异常,程序运行过程中自动抛出RuntimeException或者其子类,程序终止,自动回滚。

    ②使用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动回滚。

    注意:如果在try-catch语句中对可能出现的异常(RuntimeException)进行了处理,没有再手动throw异常,spring认为该方法成功执行,不会进行回滚,此时需要调用②中方法进行手动回滚,如下图:

    另外,如果try-catch语句在finally中进行了return操作,那么catch中手动抛出的异常也会被覆盖,同样不会自动回滚。

            //不会自动回滚
            try{
                throw new RuntimeException();
            }catch(RuntimeException e){
                e.printStackTrace();
            }finally{
            }
            //会自动回滚
            try{
                throw new RuntimeException();
            }catch(RuntimeException e){
                e.printStackTrace();
                throw new RuntimeException();
            }finally{
            }

     实际常用的操作是,在controller层进行异常处理try-catch(因为controller的返回信息直接面向应用的使用人员  应该返回他们能读懂的信息),service层和dao层不进行异常处理,直接都向上抛出到controller中进行统一处理。

  • 相关阅读:
    Windows Server 2008 R2 免费使用 7200天 激活
    ceph部署步骤
    for循环间隔修改(解决把以空格隔开需要把一整行作为整体)
    my_learn
    fiddler-抓包
    基础软件搭建
    【原创】一层Nginx反向代理K8S化部署实践
    【原创】K8S使用ceph-csi持久化存储之CephFS
    【原创】K8S使用ceph-csi持久化存储之RBD
    [原创]自动化部署K8S(v1.10.11)集群
  • 原文地址:https://www.cnblogs.com/ZTPX/p/10566498.html
Copyright © 2011-2022 走看看