1. 程式人生 > >spring+springMVC中使用@Transcational方式管理事務的配置方法

spring+springMVC中使用@Transcational方式管理事務的配置方法

springMVC 中,事務通常都在service層控制,當然controller層也可以用事務,只要配置配對,但通常不建議直接在controller層配事務,controller的作用是管理引數以及做一些簡單的邏輯,業務都放在service層會比較規範。 所以這裡只討論service層的事務配置問題。以下是轉載自這裡的文章:

這位哥寫的例子非常正面:

spring中管理事務的配置方式除了@Transcational還有使用aop等,本文介紹@Transcational方式,但是推薦使用aop方式。因為如果有多個事務管理器的話,你在註解中還需要註明使用哪個事務管理器@Transactional("transactionManager1")。

一、spring中一定要記得載入所有需要的bean

如果使用註解方式的話一定要記得掃描註解,下邊的例子表示掃描xxx.xxx下所有檔案(包含每一級子資料夾)中除了@Controller以外的所有註解。

<context:component-scan base-package
="xxx.xxx"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>

二、而springmvc中則只掃描controller

<context:component-scan base-package="xxx.xxx" use-default-filters="false" >
        <context:include-filter 
type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan>

既然是隻掃描,那麼預設掃描的那些東西都要去掉。總之如果使用context:include-filter(注意上邊兩段寫的分別是include和exclude),則一定不要忘記use-default-filters="false"。

三、spring中其它要配的除了資料來源外必須還有這些:

    <bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- 使用annotation註解方式配置事務 --> <tx:annotation-driven transaction-manager="transactionManager" />
transactionManager中的dataSource是告訴事務管理器,呼叫哪個資料庫的commit和rollback

tx:annotation-driven則是為所有已經載入(步驟一 中 的掃描就是載入過程)進spring的,且有@Transcational註解的bean交給transaction-manager中所寫的事務管理器來管理事務。如果想指定用哪個事務管理器就可以在註解中寫了,例如@Transactional("transactionManager1")
四、其中關於use-default-filters的解釋,請看濤哥的一篇文章,裡面寫得非常清楚。http://jinnianshilongnian.iteye.com/blog/1762632
五、另一個問題:上面濤哥的文章中也提到,就是事務不生效的問題。原因:

如果在springmvc配置檔案,不使用cn.javass.demo.web.controller字首,而是使用cn.javass.demo,則service、dao層的bean可能也重新載入了,但事務的AOP代理沒有配置在springmvc配置檔案中,從而造成新載入的bean覆蓋了老的bean,造成事務失效。只要使用use-default-filters=“false”禁用掉預設的行為就可以了。

六、再探討一下@Transactional註解找到/找不到事務的問題。實際上@Transactional會找到我們在容器配置的事務管理器,如果容器中配置了兩個事務管理器,比如是transactionManager1 和 transactionManager2 。那麼註解就要變為:@Transactional("transactionManager1")或者 @Transactional("transactionManager2"),如果只是@Transactional ,那麼名字預設是transationManager 。如果我們並沒有在spring容器中配置上面第三點中的事務管理器,那麼@Transactional的時候就找不到事務管理器,事務不會生效。同樣道理,通常我們不會在spring-mvc的配置檔案中配置事務管理器,所以在Controller層新增@Transactional也不會生效。如果想在Controller層啟用事務,除了需要加@Transactional到Controller層,還需要在spring-mvc的配置檔案中新增上面第三點中的事務管理器的配置。關於這個問題的討論,還有另一篇文章可以參考:http://blog.csdn.net/mmm333zzz/article/details/45288061