springboot事務

在SpringBoot則很是簡單,只需在業務層添加事務註解(@Transactional )便可快速開啓事務。app

@Transactional
    public void addMoney() throws Exception {
        //先增長餘額
        accountMapper.addMoney();
        //而後遇到故障
        throw new RuntimeException("發生異常了..");
    }

注意:

常見坑點1:遇到非檢測異常時,事務不開啓,也沒法回滾。

例以下面這段代碼,帳戶餘額依舊增長成功,並無由於後面遇到檢測異常而回滾!!spa

@Transactional
    public void addMoney() throws Exception {
        //先增長餘額
        accountMapper.addMoney();
        //而後遇到故障
        throw new SQLException("發生異常了..");
    }

緣由分析:由於Spring的默認的事務規則是遇到運行異常(RuntimeException)和程序錯誤(Error)纔會回滾。若是想針對非檢測異常進行事務回滾,能夠在@Transactional 註解裏使用
rollbackFor 屬性明確指定異常。例以下面這樣,就能夠正常回滾:.net

@Transactional(rollbackFor = Exception.class)
    public void addMoney() throws Exception {
        //先增長餘額
        accountMapper.addMoney();
        //而後遇到故障
        throw new SQLException("發生異常了..");
    }

常見坑點2: 在業務層捕捉異常後,發現事務不生效。

這是許多新手都會犯的一個錯誤,在業務層手工捕捉並處理了異常,你都把異常「吃」掉了,Spring天然不知道這裏有錯,更不會主動去回滾數據。例如:下面這段代碼直接致使增長餘額的事務回滾沒有生效。code

@Transactional
    public void addMoney() throws Exception {
        //先增長餘額
        accountMapper.addMoney();
        //謹慎:儘可能不要在業務層捕捉異常並處理
        try {
            throw new SQLException("發生異常了..");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

推薦作法:在業務層統一拋出異常,而後在控制層統一處理。事務

@Transactional
    public void addMoney() throws Exception {
        //先增長餘額
        accountMapper.addMoney();
        //推薦:在業務層將異常拋出
        throw new RuntimeException("發生異常了..");
    }
相關文章
相關標籤/搜索