簡體   English   中英

Spring中的事務處理方法

[英]Transactional methods in Spring

我被困了很多次,問自己為什么我的代碼沒有將數據持久化到數據庫中。 我的意思是,我已經用@Transactional注釋了我的簡單方法,並且一切似乎都很好,沒有問題。 在嘗試找出原因之后,我最終會記得我實際上是在同一類內部調用事務方法的,因此spring將立即忽略該注釋。 我碰巧在那些情況下,我在@Controller層上將該方法標記為事務性的,這似乎限制了代碼的可重用性。 因此,關於這個問題,我有兩個問題:

  • @Transactional最適合放置在Spring體系結構的哪個級別( @Controller@Service @Controller等。)?
  • 當從類內部調用帶注釋的方法時,為什么spring會完全忽略注釋?

Spring文檔是解釋此問題的很好的資料。 最基本的說,當您使用帶有注解(例如事務性)的spring時,spring注入對象時實際上是在注入該對象的代理。 這樣,它就可以攔截方法調用並執行諸如管理事務之類的工作。 當您自己實例化一個對象或對同一類中的另一個實例方法進行調用時,您不是通過spring代理進行調用的,它將無法管理該調用。

至於應在何處放置事務注釋,這取決於您的代碼庫和對項目結構的看法。 就個人而言,我將它們放在邏輯上合理的情況下放在調用堆棧的上方。

@Transactional最適合放置在Spring體系結構的哪個級別(@ Controller,@ Service等。)?

根據我的經驗,最好將其放在服務層上。 您也可以將其添加到其他層中,但要保持一致。 因為如果您基於此'@Transactional'注釋添加更多注釋,則它在整個應用程序中的行為應相同。

當從類內部調用帶注釋的方法時,為什么spring會完全忽略注釋?

您可以閱讀有關基於代理的Spring AOP的工作原理。 這是您的參考資料-

春季嵌套交易

@Transactional方法調用沒有@Transactional注釋的另一個方法?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM