2017-09-27 75 views
1

我被困了很多次,問自己爲什麼我的代碼不能將數據保存在數據庫中。我的意思是,我有我的簡單的方法註釋@Transactional和everyting似乎很好,沒有問題。在嘗試發現一段時間的原因之後,我最終會記得我實際上正在從同一個類的內部調用我的事務方法,因此Spring將立即忽略該註釋。在我看來,在這些情況下,我將該方法標記爲我的@Controller圖層上的事務處理,這似乎限制了代碼的可重用性。所以,我在這個問題方面的兩個問題:Spring中的事務處理方法

  • 在其中彈簧結構的水平是@Transactional最好放置(@Controller@Service等)?
  • 爲什麼Spring在類的內部調用帶註釋的方法時會忽略註釋?
+1

https://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#tx-decl-explained –

回答

1

春季文檔是一個非常好的來源來解釋這一點。從最基本的角度來說,當你使用spring這樣的註釋來處理事務時,當spring注入一個對象時,它實際上是在向該對象注入一個代理。這允許它攔截方法調用並執行諸如管理事務之類的事情。當你自己實例化對象或調用同一類中的另一個實例方法時,你不會通過Spring代理調用它,並且它將無法管理該調用。

至於應該放置交易註釋的地方,這取決於您的代碼庫和項目結構的意見。就我個人而言,我把它們放在調用堆棧的頂端,從邏輯上講是有道理的。

1

在哪個級別的Spring架構是@Transactional最佳 放置(@Controller,@Service等..)?

根據我的經驗,最好放在服務層上。您也可以將其添加到其他圖層中,但只能保持一致。因爲如果您根據此「@Transactional」註釋添加更多註釋,則它的行爲在整個應用程序中應該相同。

爲什麼彈簧會在類的內部調用帶註釋的 方法時忽略註釋?

您可以閱讀有關基於代理的Spring AOP的工作原理。這是你們的引用 -

Spring nested transactions

@Transactional method calling another method without @Transactional anotation?