• try-catch 回滚事务,避免回滚失效的操作


    阿里手册异常日志篇:【强制】有 try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。

    容易让人忽略的是:方法上未加任何属性的@Transactional注解只能在抛出RuntimeException或者Error时才会触发事务的回滚,常见的非RuntimeException是不会触发事务的回滚的。

    避免失效有如下几种方式:

    1. 使用@Transactional(rollbackFor = Exception.class)注解,前提是不含有try{...}catch{...}捕获异常。

    2. 使用@Transactional注解,不带任何属性,抛出@Transactional注解默认识别的RuntimeException

      @Transactional
        public String getUserInfo() {
            try {
                //do something 
                return "成功信息";
            } catch (Exception e) {
                e.printStackTrace();
                //异常处理这里采用lombok
                log.error("异常日志", e.getMessage());
                //抛出异常
                throw new RuntimeException();
            }
        }
    

    弊端:非运行时异常不会回滚

    3.使用@Transactional(rollbackFor = { Exception.class }),也能抛出捕获的非RuntimeException异常

       @Transactional(rollbackFor = Exception.class)
        public String uploadFile() throws IOException {
            InputStream input = null;
            try {
                input = new FileInputStream("F:\BaiduNetdiskDownload\1.jpg");
    
                int data = input.read();
                while (data != -1) {
                    System.out.print((char) data);
                    data = input.read();
                }
                //do something
                return "成功信息";
            } catch (Exception e) {
                e.printStackTrace();
                //异常处理这里采用lombok
                log.error("异常日志", e.getMessage());
                //抛出所捕获的异常
                throw e;
    
            }
        }
    

    4.手动回滚

    阿里规约硬性要求的

      @Transactional
        public String getUserInfo() {
            try {
                //do something
                return "成功信息";
            } catch (Exception e) {
                e.printStackTrace();
                //异常处理这里采用lombok
                log.error("异常日志", e.getMessage());
                //手动回滚
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return "自定义异常信息";
    
            }
        }
    

    参考链接:https://www.cnblogs.com/zjfjava/p/9963958.html

  • 相关阅读:
    58. 最后一个单词的长度
    53. 最大子序和
    50. Pow(x, n)
    35. 搜索插入位置
    28. 实现 strStr()
    leetcode 27. 移除元素
    leetcode 26. 删除排序数组中的重复项
    leetcode 21. 合并两个有序链表
    20. 有效的括号
    多线程案例_循环打印_设计4个线程...
  • 原文地址:https://www.cnblogs.com/ringbug/p/15074553.html
Copyright © 2020-2023  润新知