2011-06-03 83 views
35

我在Service類中看到了一個標記爲@Transactional的方法,但它也調用了同一類中未標記爲@Transactional的其他方法。@Transactional方法調用另一個沒有@Transactional註解的方法?

這是否意味着調用不同的方法使應用程序打開單獨連接到數據庫或暫停父事務,等等?

什麼是對的方法,而不由與@Transactional註釋的另一種方法叫任何註釋的默認行爲?

感謝

回答

49

當你調用一個事務塊中沒有@Transactional的方法,父事務將繼續新的方法。它將使用從父方法(與@Transactional)相同的連接,並引起了所謂的方法(不@Transactional任何異常將導致事務回滾作爲事務定義配置。

如果你調用一個方法而@Transactional在同一實例中使用@Transactional的方法進行註釋,則被調用方法的事務行爲不會對事務產生任何影響。但是,如果您從具有事務定義的另一方法調用具有事務定義的方法,並且它們處於不同的實例,然後在調用方法的代碼將遵循調用的方法給出的交易的定義。

你可以找到更多詳情請參閱聲明式交易管理spring transaction documentation

Spring聲明式事務模型使用AOP代理。所以AOP代理負責創建交易。只有當實例中的方法從實例外調用時,AOP代理纔會處於活動狀態。

+0

是彈簧默認行爲? – goe 2011-06-03 03:18:34

+0

是的。這是默認行爲。 – 2011-06-03 03:20:22

+0

@Arun對於事務傳播屬性還有一個維度。在['@ Transactional'](http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Transactional.html)可以指定傳播屬性即是枚舉值鍵入['@ Propagation'](http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/transaction/annotation/Propagation.html)。 – 2011-06-03 12:43:32

5

@Transactional標誌着事務邊界(開始/結束),但是交易本身被綁定到線程。一旦事務開始,它將在方法調用中傳播,直到原始方法返回並且事務提交/回滾。

如果另一個方法被稱爲具有@Transactional註解然後傳播取決於註釋的傳播屬性。

12
  • 這是否意味着分離方法的調用會導致應用程序打開到DB的單獨連接或掛起父事務等?

這取決於propagation level。這裏是所有可能的級別values

例如,在案件的傳播水平NESTED當前事務會「暫停」和一個新的事務將被創建(注:嵌套事務的實際創建將只在特定的事務管理器工作)

  • 沒有通過@Transactional註解由另一個方法調用的任何註釋的方法的默認行爲是什麼?

默認傳播級別(您稱之爲「行爲」)爲REQUIRED。在情況下,「內」方法被調用,其具有在其上的註釋@Transactional(或經由XML聲明交易),它將所述同一事務,例如內執行「沒有新的」被創建。

+0

那些沒有任何註釋的NOT_SUPPORTED子調用呢?它是否繼承了NOT_Supported或者是否因爲REQURED是默認值而打開了新的事務?例如:f1.call(){f2()},註釋NOT_SUPPORTED用於f1,非註解用於f2。 – Dave 2017-07-07 21:07:50

相關問題