2013-10-31 120 views
9

下面是我的應用程序春數據JPA @Transactional

控制器的流量 - 服務 - 庫

在服務層,我們有@Transactional註釋 我們也有jpa:repository配置,其中我們指定的實體管理器和TXN經理。

我的疑問是,我覺得考慮jpa:repositories中指定的txn管理器,並且在服務層沒有指定@Transactional的影響。 例如:服務層@Transactional可以映射到自定義txn管理器,其中由服務調用的存儲庫可能具有不同的txn管理器。那樣會不會造成問題?

有人可以澄清我們在使用jpa存儲庫時是否需要在服務層放置@Transactional

+4

不能在DAO層劃分事務:單個工作單元通常會使用多個DAO,並由單一事務服務方法進行編排。爲什麼要定義2個不同的事務管理器,因爲你只需要一個? –

+0

是的......因爲當你做多個數據庫調用時,你希望單個事務不是多個事務。因此,您需要在服務級別啓動的事務。 –

+0

同意。目前的實施有一個設計問題。該服務調用連接到兩個不同架構(這些是純粹的select查詢而不是JTA)的repostories。這就是jpa存儲庫配置了不同的實體管理器工廠和不同的txn管理器的原因。 – lives

回答

18

見春數據參考的第2.3節:

http://docs.spring.io/spring-data/jpa/docs/1.0.0.M1/reference/html/#transactions

在你的資料庫CRUD方法是通過默認的事務。雖然這些交易可以根據需要進行構造,它是正常的情況下,如在上面的意見提出,即交易在服務層中指定並且在這種情況下:

在儲存庫中的交易的配置將被忽略 然後作爲外部交易配置確定實際使用的一個 。

因此,在回答您的問題時,無論任何Spring Data事務管理如何,事務都可以(也應該)在服務級別指定。

+0

謝謝 - 這是一個非常有用的信息。我將在調試模式下重新測試並驗證上述內容。 – lives

+1

我觀察到Repository上的事務攔截器不使用由服務層啓動的transactionManager。在存儲庫代理中,執行搜索以通過名稱「transactionManager」標識bean並正在使用該bean。如果我們希望Spring jpa數據成爲服務層啓動的事務的一部分,是否有任何設置要完成? – lives