採用的基本搭建環境:SpringMVC、MyBatis、MySQL、tomcat
Spring事務管理分解了傳統的全局事務管理和本地事務管理的劣勢,使得在任何環境中均可以使用統一的事務管理模型,你能夠寫一次代碼,而後在不一樣的環境從你的代碼裏面配置不一樣的事務管理策略,Spring提供兩種事務管理策略:一種是聲明式事務管理策略,另外一種是編程式事務管理策略,這裏主要介紹聲明式事務管理策略
因爲採用的是SpringMVC、 MyBatis,故統一採用了標註來聲明Service、Controller
因爲服務器啓動時的加載配置文件的順序爲web.xml---root-context.xml(Spring的配置文件)---servlet-context.xml(SpringMVC的配置文件),因爲root-context.xml配置文件中Controller會先進行掃描裝配,可是此時service尚未進行事務加強處理,獲得的將是原樣的Service(沒有通過事務增強處理,故而沒有事務處理能力),因此咱們必須在root-context.xml中不掃描Controller,配置以下:
<!-- 自動掃描組件,這裏要把controler下面的 controller去除,他們是在spring3-servlet.xml中配置的,若是不去除會影響事務管理的。 -->
<context:component-scan base-package="com.sence">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
在servlet-context.xml中掃描Controller同時不掃描Service,配置以下:
<!-- 掃描全部的controller 可是不掃描service-->
<context:component-scan base-package="com.sence">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
下面就能夠進行配置聲明式事務管理了,配置以下:
<!-- transaction manager, use DataSourceTransactionManager -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- spring declarative transaction management -->
<aop:config>
<aop:pointcut id="fooServiceMethods"
expression="execution(* com.sence.*.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="find*" read-only="true"/>
<tx:method name="load*" read-only="true"/>
<tx:method name="*" rollback-for="CustomException"/>
</tx:attributes>
</tx:advice>
到此個人配置完成了,可是通過個人測試,當我往MySQL數據庫表批量增長對象時,當其中一個對象出現錯誤,拋出CustomException事務卻不回滾,這個真是使人頭疼,因而我繼續查找,步驟以下: 1. 查找是否聲明式事務管理有誤,如切入點寫錯了 2. 查找Controller掃描部分配置是否正確 可是這兩點我都查了,仍是事務沒有回滾,這個時候我沒辦法了,只能動用終極武器了:查看源碼,開始debug程序,發現進入到了事務,而且出現了異常,捕獲後進入到了回滾程序,可是數據庫卻沒有回滾,爲了不Spring本身的AbstractPlatformTransactionManager的干擾,我本身定製了一個事務管理類並繼承配置文件中的DataSourceTransactionManager類,這樣能夠清楚的看到程序的運行軌跡,繼續DEBUG,仍是出現了異常,捕獲後進入到了回滾程序,可是數據庫卻沒有回滾,此刻我開始懷疑MySQL數據庫的事務支持功能了,因而網上查找MySQL對事務的支持,發現MySQL4.0之後能夠支持事務,可是MySql的數據表分爲兩類,一類是傳統的數據表,另外一類則是支持事務的數據表。支持事務的數據表分爲兩種:InnoDB和BerkeleyDB 使用一下命令:show create table *** 查看個人數據庫表的屬性才發現個人表原來是傳統類型的表,因而我使用navicat更改了表的類型爲:InnoDB,而後運行程序發現事務回滾了 到此SpringMVC聲明式事務管理配置完成,並運行正確