中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解Spring雙層事務

發布時間:2021-10-20 13:46:26 來源:億速云 閱讀:161 作者:iii 欄目:編程語言

這篇文章主要講解了“如何理解Spring雙層事務”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解Spring雙層事務”吧!

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

大致代碼如下

@Service("noteService")  public class NoteServiceImpl implements NoteService {      @Resource      private SearchService searchService;      @Transactional(rollbackFor = Throwable.class)      @Override      public CommonResponse<NoteEntity> save(NoteEntity note) {          // 一系列 DB 操作          try {              searchService.sync(note);          } catch (Exception e) {              e.printStackTrace();          }          return CommonResponse.success(entity);      }  }  @Service("searchService")  public class SearchServiceImpl implements SearchService {      @Transactional(rollbackFor = Throwable.class)      @Override      public void sync(NoteEntity note) {          // 一系列 DB 操作          throw new RuntimeException("同步異常! [XXX]");     }  }  @SpringBootTest  public class NoteTests {      @Resource      private NoteService noteService;      @Test      public void saveNote() {          NoteEntity entity = new NoteEntity();          entity.setTitle("念奴嬌赤壁懷古");          entity.setContent("大江東去,浪淘盡,千古風流人物。故壘西邊,人道是:三國周郎赤壁。。。");          entity.setTags("蘇軾,宋代");          entity.setCategory("蘇軾詩詞");          try {              noteService.save(entity);          } catch (Exception e) {              e.printStackTrace();              // FIXME 我想在這里拿到的是 同步異常! [XXX]              // FIXME 但是這里拿到的是 Transaction silently rolled back because it has been marked as rollback-only              System.out.println(">>>>>>>>>> " + e.getMessage());          }      }  }

事出有因

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

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

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

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

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

具體原因

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

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

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

怎么解決?

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

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

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

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

感謝各位的閱讀,以上就是“如何理解Spring雙層事務”的內容了,經過本文的學習后,相信大家對如何理解Spring雙層事務這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

滨州市| 榆林市| 古丈县| 沈阳市| 和硕县| 吉林市| 太谷县| 神池县| 报价| 墨脱县| 莫力| 永登县| 玛曲县| 长沙县| 兴安盟| 汉沽区| 青州市| 同心县| 宁波市| 绿春县| 正镶白旗| 沂源县| 宜兰县| 宁海县| 楚雄市| 新源县| 三河市| 灌阳县| 酒泉市| 八宿县| 嵩明县| 南江县| 修文县| 泸溪县| 衡山县| 伊川县| 嘉禾县| 海阳市| 甘德县| 武宣县| 怀来县|