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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM