精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網(wǎng)站建設(shè)資訊

NEWS

網(wǎng)站建設(shè)資訊

如何理解Spring雙層事務(wù)

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

為河間等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及河間網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、河間網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

系統(tǒng) A 調(diào)用系統(tǒng) B 執(zhí)行數(shù)據(jù)同步,系統(tǒng) B 返回了錯(cuò)誤提示,系統(tǒng) A 需要將前邊保存的回滾掉,同時(shí)把錯(cuò)誤信息向上拋。

大致代碼如下

@Service("noteService")  public class NoteServiceImpl implements NoteService {      @Resource      private SearchService searchService;      @Transactional(rollbackFor = Throwable.class)      @Override      public CommonResponse 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("大江東去,浪淘盡,千古風(fēng)流人物。故壘西邊,人道是:三國周郎赤壁。。。");          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());          }      }  }

事出有因

代碼歷史久遠(yuǎn),為何這樣寫已無從追溯。

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

沒有特殊的配置,自然是走默認(rèn)的事務(wù)傳播機(jī)制了,也就是 Propagation.REQUIRED。

國際慣例,列出事務(wù)傳播機(jī)制:

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

具體原因

1、看了上邊的事務(wù)傳播機(jī)制,繼續(xù)細(xì)化問題,內(nèi)外層共用一個(gè)事務(wù),內(nèi)層拋出異常,會(huì)導(dǎo)致整個(gè)事務(wù)失敗。

2、繼續(xù)分析,外層邏輯進(jìn)行了 try catch,就導(dǎo)致內(nèi)層的異常無法繼續(xù)向上拋出,外層事務(wù)會(huì)繼續(xù)提交。

3、事務(wù)提交時(shí),進(jìn)行事務(wù)狀態(tài)的判斷,就發(fā)現(xiàn)這個(gè)事務(wù)是失敗的,需要回滾,所以拋出了 Transaction silently rolled back because it has been marked as rollback-only 的異常。

怎么解決?

銀彈自然是沒有的,根據(jù)業(yè)務(wù)場景選擇合適的方案。

1、當(dāng)前這種場景,直接把外層邏輯中的 try catch 去掉即可。異常直接向上拋,事務(wù)就不會(huì)繼續(xù)提交,調(diào)用方拿到的就是一手的異常;

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

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

感謝各位的閱讀,以上就是“如何理解Spring雙層事務(wù)”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何理解Spring雙層事務(wù)這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!


名稱欄目:如何理解Spring雙層事務(wù)
當(dāng)前鏈接:http://m.jcarcd.cn/article/isjcgg.html
主站蜘蛛池模板: 区三四区视频黑人 | 91视频哪里看 | 国产一区二区三区不 | 日本www在线视频 | 国产欧美va | 国产精品露脸 | 精品一线二线三 | 日本视频网站在线w | 国产性爱在线播放 | 日本大片 | 伦理片免费观在线看 | 91国自产精品 | www.日本高清| 精品欧美在线观看 | 午夜日韩视频在线 | 国产精品欧美一 | 国产美女视频免费 | 日韩亚洲产在线观看 | 三级日韩欧美在线 | 成人午夜福利 | 国产在线精 | 麻花传剧| 91视频app污 91视频app下载 | 欧美日韩不卡中文网 | 日韩电影在线电影 | 欧美一级国 | 国产亚洲中文字幕 | 欧美午夜性春 | 区二区网站视频 | 国产免费观看激情 | 欧美日韩欧 | 午夜日韩免费视频 | 日本不卡一二三区 | 国产欧美国日产综合 | 国产精品国产馆 | 午夜视频福利 | 国产在在线免 | 国产情侣91在 | 欧美亚洲性爱在线 | 成人午夜在线 | 精品多人p群 |