Spring事務傳播行為實戰( 三 )

@Transactional(propagation = Propagation.NEVER) public void insert(KsB ksB) {ksBDao.insert(ksB); }結果:org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation ‘never’
總結以非事務方式執行 , 如果當前存在事務,則拋出異常
7、NESTED7.1、父方法無事務 , 子方法開啟事務,子方法報錯 public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);KsB ksB = new KsB();ksB.setAge(10);ksBService.insertError(ksB); } @Transactional(propagation = Propagation.NESTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:ks_a數據插入成功,ks_b數據回滾

Spring事務傳播行為實戰

文章插圖
Spring事務傳播行為實戰

文章插圖
7.2、父方法開啟事務,子方法開啟事務,子方法報錯 @Transactional public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);KsB ksB = new KsB();ksB.setAge(10);ksBService.insertError(ksB); } @Override @Transactional(propagation = Propagation.NESTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:數據都回滾
Spring事務傳播行為實戰

文章插圖
Spring事務傳播行為實戰

文章插圖
7.3、父方法開啟事務,子方法開啟事務,父方法報錯 @Transactional public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);KsB ksB = new KsB();ksB.setAge(10);ksBService.insert(ksB);throw new RuntimeException("主方法報錯"); } @Transactional(propagation = Propagation.NESTED) public void insert(KsB ksB) {ksBDao.insert(ksB); }結果:數據都回滾
Spring事務傳播行為實戰

文章插圖
Spring事務傳播行為實戰

文章插圖
7.4、父方法開啟事務 , 子方法開啟事務,子方法報錯,父方法并捕獲 @Transactional public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);try {KsB ksB = new KsB();ksB.setAge(10);ksBService.insertError(ksB);} catch (Exception e) {//dosomething} } @Transactional(propagation = Propagation.NESTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:ks_a數據插入成功,ks_b數據回滾
Spring事務傳播行為實戰

文章插圖
Spring事務傳播行為實戰

文章插圖
總結如果當前沒有事務,則新開事務執行如果當前存在事務,則在嵌套事務內執行
四、結論1、NESTED和REQUIRES區別區別在于:如果當前存在事務,子方法拋異常時NESTED在父方法可以選擇捕獲子方法,父方法數據不會回滾;REQUIRES無論捕不捕獲 , 父方法數據都回滾
2、NESTED和REQUIRES_NEW區別區別:如果當前存在事務,父方法拋異常時NESTED數據回滾 , REQUIRES也是如此REQUIRES_NEW數據不回滾
3、七種傳播行為總結說明:加入該事務,指的是父、子方法共用一個事務(無論父、子方法報錯 , 整體回滾)
REQUIRED父方法無事務,子方法開啟新事務父方法有事務 , 就加入該事務
SUPPORTS如果當前不存在事務,就以非事務執行如果當前存在事務,就加入該事務
MANDATORY如果當前不存在事務 , 就拋出異常如果當前存在事務,就加入該事務
REQUIRES_NEW無論當前存不存在事務 , 都創建新事務
NOT_SUPPORTED以非事務方式執行,如果當前存在事務 , 父方法以事務方式執行,子方法以非事務方式執行
NEVER以非事務方式執行 , 如果當前存在事務 , 則拋出異常
NESTED如果當前沒有事務,則新開事務執行如果當前存在事務,則在嵌套事務內執行
 【Spring事務傳播行為實戰】

推薦閱讀