2012-09-28 94 views
15

使用JdbcTemplate時,我是否需要顯式配置事務?Spring的Jdbc模板和事務

我的代碼佈局如下所示:

我將有一個將被注入到我的UserService一個userDAO的,然後我的控制器將在我的UserService方法的調用。

我想盡可能簡單地保持事務的事務性,並且我不需要多個數據庫調用來跨越事務。

默認情況下,我是否必須在我的配置文件中執行任何操作或在任何地方使用@Transaction批註?

現在在我的控制器中說我需要對我的userService和accountService進行2次調用,我可以以某種方式明確地將其包含在事務中嗎?

userService.updateUser(user); 
accountService.updateXXX(...); 

回答

21

是,JdbcTemplate不是事務管理的替代品。您仍然受益於數據庫事務,因此userService.updateUser將在數據庫事務中運行,但如果accountService.updateXXX失敗,userService.updateUser而不是回滾。

如果您不想使用AOP,則可以使用TransactionTemplate代替。請參閱Spring Reference Documentation中的programmatic transaction management

我之前見過的一種模式是MVC控制器類調用封裝操作的業務服務。業務類的方法可以註釋@Transactional

+1

哇,這是一個交易的代碼分配,@Transactional肯定使它更少的樣板寫! – loyalflow

+0

這是,但是如果你需要訪問'TransactionStatus',它是非常有用的。 –

+1

+1爲商業服務理念。恕我直言,生活會更容易,如果每個人都這樣做。 – xdhmoore

9

如果您的控制器想要對用戶和帳戶做一些事情,並且在一個事務中發生所有事情,那麼您應該使用一種方法來執行所有這些事情。爲每個DAO創建一個服務並不是一個好主意,因爲最終會在DAO周圍產生不需要執行的包裝,並且處理速度會很慢,因爲數據庫必須爲每次調用DAO創建一個單獨的事務,您正在做比應該做的更多的工作。

該服務應該爲控制器或其他人調用它提供功能。我嘗試創建服務的想法是服務提供對特定類型的用戶有用的特定功能。

+1

+1借調。這使得幾件事情更容易,包括測試,並且如果需要將任何功能公開給除控制器以外的其他視圖(例如REST API),則可以輕鬆實現。 – xdhmoore