需求:需要捕獲到@Transactional中的異常,並不影響事物回滾
@Transactional(rollbackFor = Exception.class) public void test() { try { updata(); updata2(); } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//如果updata2()拋了異常,updata()會回滾,不影響事物正常執行 }
spring 的默認事務機制,當出現unchecked異常時候回滾,checked異常的時候不會回滾;
異常中unchecked異常包括error和runtime異常,需要try catch或向上拋出的異常為checked異常比如IOException,也就是說程序拋出runtime異常的時候才會進行回滾,其他異常不回滾,可以配置設置所有異常回滾:
@Transactional(rollbackFor = { Exception.class })
當有try catch后捕獲了異常,事務不會回滾,如果不得不在service層寫try catch 需要catch后 throw new RuntimeException 讓事務回滾;
Spring的AOP即聲明式事務管理默認是針對unchecked exception回滾。也就是默認對R untimeException()異常或是其子類進行事務回滾;checked異常,即Exception可try{}捕獲的不會回滾,如果使用try-catch捕獲拋出的unchecked異常后沒有在catch塊中采用頁面硬編碼的方式使用spring api對事務做顯式的回滾,則事務不會回滾, “將異常捕獲,並且在catch塊中不對事務做顯式提交=生吞掉異常” ,要想捕獲非運行時異常則需要如下配置