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


文章插圖
2.2、父方法開啟事務 , 子方法開啟事務,子方法報錯 @Transactional 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.SUPPORTS) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:兩表數據都回滾了

Spring事務傳播行為實戰

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

文章插圖
總結如果當前不存在事務,就以非事務執行如果當前存在事務,就加入該事務
3、MANDATORY3.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.MANDATORY) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation ‘mandatory’
3.2、父方法開啟事務,子方法開啟事務,子方法報錯 @Transactional 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.MANDATORY) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:兩表數據都回滾了
Spring事務傳播行為實戰

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

文章插圖
總結如果當前不存在事務,就拋出異常如果當前存在事務,就加入該事務
4、REQUIRES_NEW4.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.REQUIRES_NEW) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:ks_a數據插入成功,ks_b數據回滾
Spring事務傳播行為實戰

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

文章插圖
4.2、父方法開啟事務,子方法開啟事務,父方法報錯 @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.REQUIRES_NEW) public void insert(KsB ksB) {ksBDao.insert(ksB); }結果:ks_a數據回滾,ks_b數據插入成功
Spring事務傳播行為實戰

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

文章插圖
總結無論當前存不存在事務 , 都創建新事務
5、NOT_SUPPORTED5.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.NOT_SUPPORTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:數據都插入成功
Spring事務傳播行為實戰

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

文章插圖
5.2、父方法開啟事務,子方法開啟事務,子方法報錯 @Transactional 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.NOT_SUPPORTED) public void insertError(KsB ksB) {ksBDao.insert(ksB);throw new RuntimeException("子方法報錯"); }結果:ks_a數據回滾,ks_b數據插入成功
Spring事務傳播行為實戰

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

文章插圖
總結以非事務方式執行,如果當前存在事務,父方法以事務方式執行,子方法以非事務方式執行
6、NEVER父方法開啟事務,子方法開啟事務 @Transactional public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);KsB ksB = new KsB();ksB.setAge(10);ksBService.insert(ksB); }

推薦閱讀