在SpringBoot則很是簡單,只需在業務層添加事務註解(@Transactional )便可快速開啓事務。app
@Transactional public void addMoney() throws Exception { //先增長餘額 accountMapper.addMoney(); //而後遇到故障 throw new RuntimeException("發生異常了.."); }
例以下面這段代碼,帳戶餘額依舊增長成功,並無由於後面遇到檢測異常而回滾!!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("發生異常了.."); }
這是許多新手都會犯的一個錯誤,在業務層手工捕捉並處理了異常,你都把異常「吃」掉了,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("發生異常了.."); }