成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring雙層事務,我拋出的異常去哪了?

開發 后端
系統 A 調用系統 B 執行數據同步,系統 B 返回了錯誤提示,系統 A 需要將前邊保存的回滾掉,同時把錯誤信息向上拋。

[[375634]]

系統 A 調用系統 B 執行數據同步,系統 B 返回了錯誤提示,系統 A 需要將前邊保存的回滾掉,同時把錯誤信息向上拋。

大致代碼如下 

  1. @Service("noteService")  
  2. public class NoteServiceImpl implements NoteService {  
  3.     @Resource  
  4.     private SearchService searchService;  
  5.     @Transactional(rollbackFor = Throwable.class)  
  6.     @Override  
  7.     public CommonResponse<NoteEntity> save(NoteEntity note) {  
  8.         // 一系列 DB 操作  
  9.         try {  
  10.             searchService.sync(note);  
  11.         } catch (Exception e) {  
  12.             e.printStackTrace();  
  13.         }  
  14.         return CommonResponse.success(entity);  
  15.     }  
  16.  
  17. @Service("searchService")  
  18. public class SearchServiceImpl implements SearchService {  
  19.     @Transactional(rollbackFor = Throwable.class)  
  20.     @Override  
  21.     public void sync(NoteEntity note) {  
  22.         // 一系列 DB 操作  
  23.         throw new RuntimeException("同步異常! [XXX]"); 
  24.     }  
  25.  
  26. @SpringBootTest  
  27. public class NoteTests {  
  28.     @Resource  
  29.     private NoteService noteService;  
  30.     @Test  
  31.     public void saveNote() {  
  32.         NoteEntity entity = new NoteEntity();  
  33.         entity.setTitle("念奴嬌赤壁懷古");  
  34.         entity.setContent("大江東去,浪淘盡,千古風流人物。故壘西邊,人道是:三國周郎赤壁。。。");  
  35.         entity.setTags("蘇軾,宋代");  
  36.         entity.setCategory("蘇軾詩詞");  
  37.         try {  
  38.             noteService.save(entity);  
  39.         } catch (Exception e) {  
  40.             e.printStackTrace(); 
  41.              // FIXME 我想在這里拿到的是 同步異常! [XXX]  
  42.             // FIXME 但是這里拿到的是 Transaction silently rolled back because it has been marked as rollback-only  
  43.             System.out.println(">>>>>>>>>> " + e.getMessage());  
  44.         }  
  45.     }  

事出有因

代碼歷史久遠,為何這樣寫已無從追溯。

納悶了一會兒,看到雙層事務,就想起了 Spring事務傳播機制,前邊理解得比較膚淺。Spring 系列面試題和答案我全部整理好了,請關注公眾號Java技術棧,回復:面試。

沒有特殊的配置,自然是走默認的事務傳播機制了,也就是 Propagation.REQUIRED。

國際慣例,列出事務傳播機制: 

  1. 1、PROPAGATION_REQUIRED 
  2. 當前沒事務,則創建事務;存在事務,就加入該事務,這是最常用的設置。  
  3. 2、PROPAGATION_SUPPORTS  
  4. 當前存在事務,就加入事務,當前不存在事務,就以非事務方式執行。 
  5. 3、PROPAGATION_MANDATORY  
  6. 當前存在事務,就加入事務;當前不存在事務,就拋出異常。  
  7. 4、PROPAGATION_REQUIRES_NEW  
  8. 無條件創建新事務。  
  9. 5、PROPAGATION_NOT_SUPPORTED  
  10. 以非事務方式執行,如果當前存在事務,就將當前事務掛起。  
  11. 6、PROPAGATION_NEVER  
  12. 以非事務方式運行,如果存在事務,就拋出異常。 
  13. 7、PROPAGATION_NESTED  
  14. 開始執行事務前,先保存一個savepoint,當發生異常時,就回滾到savepoint;沒有異常時,跟著外部事務一起提交或回滾。 

具體原因

1、看了上邊的事務傳播機制,繼續細化問題,內外層共用一個事務,內層拋出異常,會導致整個事務失敗。

2、繼續分析,外層邏輯進行了 try catch,就導致內層的異常無法繼續向上拋出,外層事務會繼續提交。

3、事務提交時,進行事務狀態的判斷,就發現這個事務是失敗的,需要回滾,所以拋出了 Transaction silently rolled back because it has been marked as rollback-only 的異常。

另外,大家想學 Spring Boot 的看下這個倉庫,太全了。

https://github.com/javastacks/spring-boot-best-practice

怎么解決?

銀彈自然是沒有的,根據業務場景選擇合適的方案。

1、當前這種場景,直接把外層邏輯中的 try catch 去掉即可。異常直接向上拋,事務就不會繼續提交,調用方拿到的就是一手的異常;

2、如果內層不是核心邏輯,記錄個日志啥的,可以把內層事務配置為 @Transactional(rollbackFor = Throwable.class, propagation = Propagation.REQUIRES_NEW), 無論如何,都創建新的事務,外層事務不受內層事務影響。但是有個問題,外層事務失敗了,內層事務還是把記錄入庫了,有可能產生臟數據;

3、如果外層事務失敗了,內層事務也不能提交,那就可以使用 @Transactional(rollbackFor = Throwable.class, propagation = Propagation.NESTED)。注意:hibernate/jpa 不支持嵌套事務 NESTED,可用 JdbcTemplate 代替。 

 

責任編輯:龐桂玉 來源: Java技術棧
相關推薦

2022-07-05 14:19:30

Spring接口CGLIB

2010-02-01 15:01:34

C++拋出異常

2009-03-18 08:59:28

throw異常Java

2021-09-04 07:56:44

Spring事務失效

2021-02-05 11:54:09

Bug漏洞代碼

2012-05-29 16:25:45

Transaction

2025-01-09 12:01:53

2020-02-06 11:30:08

代碼JavaScript&&

2013-07-17 14:13:08

產品產品失敗

2024-11-07 11:04:55

2020-10-19 11:05:17

SpringTransaction事務

2023-10-12 10:04:03

Java代碼

2023-10-30 07:36:19

Spring事務傳播機制

2024-12-17 16:44:22

Spring開發

2019-08-23 09:20:35

Spring 5編程Java

2018-05-21 11:02:24

Docker硬盤空間

2011-04-13 17:54:57

程序員

2024-01-15 08:28:31

Spring事件

2015-09-09 09:44:22

谷歌圖標

2022-04-06 11:05:25

自動駕駛商業化馬斯克
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人性生交大片免费看r链接 | 日本不卡一区 | 欧美激情 亚洲 | 亚洲香蕉在线视频 | 久久不卡 | 欧美黄在线观看 | 国产精品成人国产乱一区 | 日韩在线免费视频 | 亚洲精品国产一区 | 国产激情视频 | 精品亚洲91| 色毛片 | 色婷婷综合网站 | 99久久久无码国产精品 | 免费在线看黄 | 成人精品久久 | 亚洲欧美精品国产一级在线 | 草草草影院 | 久久久久无码国产精品一区 | 免费一级欧美在线观看视频 | 最新中文字幕一区 | 国产乱码精品一区二区三区中文 | 亚洲电影第三页 | www.天天操| 亚洲成网站 | 日韩欧美国产一区二区三区 | 99精品久久久久久 | 91视频久久 | 成人在线h | 野狼在线社区2017入口 | 国产免费一区二区三区免费视频 | 成人午夜影院 | 精品日韩在线 | 欧美日韩一| 久久久久一区二区三区四区 | 一级大黄| 日本在线小视频 | 成人伊人 | 一区二区三区视频在线观看 | 超碰操 | 日韩中文字幕一区二区 |