【事務】解決方案

最近遇到一個很棘手的問題,至今也解釋不清楚原因,不過已經找到了解決方案。

先來看看Propagation屬性的值含義,@Transactional中Propagation屬性有7個選項可供選擇:

  1. Propagation.MANDATORY。當前方法必須在已經定義的Transaction中運行,如果沒有已定義的Transaction則拋出異常。

  2. Propagation.NEST。如果沒有已定義的Transaction,當前方法新開一個Transaction並在該Transaction中運行。如果存在已定義的Transaction,當前方法在嵌套事務(Nested Transaction)中運行 — 嵌套事務中可以定義儲存點,因此可以獨立於外部的Transaction而進行rollback。

  3. Propagation.NEVER 。當前方法不應在Transaction中運行,如果存在已經定義的Transaction則拋出異常。

  4. Propagation.NOT_SUPPORTED。當前方法不應在Transaction中運行,如果存在已經定義的Transaction,則該Transaction暫停(掛起)直至該方法運行完畢。

  5. Propagation.REQUIRED。 默認值。當前方法必須在Transaction中運行。如果存在已經定義的Transaction,則該方法在已定義的Transaction中運行;如果不存在已經定義的Transaction,則該方法新開一個Transaction並在其中運行。

  6. Propagation.REQUIRES_NEW。當前方法必須在新開的Transaction中運行。如果存在已經定義的Transaction,則該已定義的Transaction暫停直至新開的Transaction執行完畢。

  7. Propagation.SUPPORTS。當前方法不需要在Transaction中運行,但如果存在已經定義的Transaction,則該方法也可以在Transaction中正常執行。

遇到的問題是這樣的:

// surports  查詢不到同一調用方法其它事務提交的更新。 原因未知
a() {//surports
     b.b();//requstd or request_new
     b.c(); //surports    --查詢不到b方法中更新的數據

解決方式:

避免這種情況的方法, a()方法不被aop代理

現在只是用這種方式解決了,但是想不明白爲什麼要這麼做,如果有哪位大神能解釋清楚原因請告知一下,非常感謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章