国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

SpringMVC+MyBatis聲明式事務(wù)管理

2019-11-26 15:00:59
字體:
供稿:網(wǎng)友
采用的基本搭建環(huán)境:SpringMVC、MyBatis、MySQL、tomcat
        Spring事務(wù)管理分解了傳統(tǒng)的全局事務(wù)管理和本地事務(wù)管理的劣勢,使得在任何環(huán)境中都可以使用統(tǒng)一的事務(wù)管理模型,你可以寫一次代碼,然后在不同的環(huán)境從你的代碼里面配置不同的事務(wù)管理策略,Spring提供兩種事務(wù)管理策略:一種是聲明式事務(wù)管理策略,另一種是編程式事務(wù)管理策略,這里主要介紹聲明式事務(wù)管理策略
由于采用的是SpringMVC、 MyBatis,故統(tǒng)一采用了標注來聲明Service、Controller
由于服務(wù)器啟動時的加載配置文件的順序為web.xml---root-context.xml(Spring的配置文件)---servlet-context.xml(SpringMVC的配置文件),由于root-context.xml配置文件中Controller會先進行掃描裝配,但是此時service還沒有進行事務(wù)增強處理,得到的將是原樣的Service(沒有經(jīng)過事務(wù)加強處理,故而沒有事務(wù)處理能力),所以我們必須在root-context.xml中不掃描Controller,配置如下:
<!-- 自動掃描組件,這里要把controler下面的 controller去除,他們是在spring3-servlet.xml中配置的,如果不去除會影響事務(wù)管理的。  -->  <context:component-scan base-package="com.sence">  <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />   .</context:component-scan>  <!-- 自動掃描組件,這里要把controler下面的 controller去除,他們是在spring3-servlet.xml中配置的,如果不去除會影響事務(wù)管理的。  --> <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>  <!-- 掃描所有的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>
下面就可以進行配置聲明式事務(wù)管理了,配置如下:
<!-- 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>  <!-- 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>
到此我的配置完成了,但是經(jīng)過我的測試,當我往MySQL數(shù)據(jù)庫表批量增加對象時,當其中一個對象出現(xiàn)錯誤,拋出CustomException事務(wù)卻不回滾,這個真是令人頭疼,于是我繼續(xù)查找,步驟如下:
1. 查找是否聲明式事務(wù)管理有誤,如切入點寫錯了
2. 查找Controller掃描部分配置是否正確
但是這兩點我都查了,還是事務(wù)沒有回滾,這個時候我沒辦法了,只能動用終極武器了:查看源碼,開始debug程序,發(fā)現(xiàn)進入到了事務(wù),并且出現(xiàn)了異常,捕獲后進入到了回滾程序,但是數(shù)據(jù)庫卻沒有回滾,為了避免Spring自己的AbstractPlatformTransactionManager的干擾,我自己定制了一個事務(wù)管理類并繼承配置文件中的DataSourceTransactionManager類,這樣可以清楚的看到程序的運行軌跡,繼續(xù)DEBUG,還是出現(xiàn)了異常,捕獲后進入到了回滾程序,但是數(shù)據(jù)庫卻沒有回滾,此刻我開始懷疑MySQL數(shù)據(jù)庫的事務(wù)支持功能了,于是網(wǎng)上查找MySQL對事務(wù)的支持,發(fā)現(xiàn)MySQL4.0以后可以支持事務(wù),但是MySql的數(shù)據(jù)表分為兩類,一類是傳統(tǒng)的數(shù)據(jù)表,另一類則是支持事務(wù)的數(shù)據(jù)表。支持事務(wù)的數(shù)據(jù)表分為兩種:InnoDB和BerkeleyDB
使用一下命令:show create table ***  查看我的數(shù)據(jù)庫表的屬性才發(fā)現(xiàn)我的表原來是傳統(tǒng)類型的表,于是我使用navicat更改了表的類型為:InnoDB,然后運行程序發(fā)現(xiàn)事務(wù)回滾了
到此SpringMVC聲明式事務(wù)管理配置完成,并運行正確
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 固安县| 宁陵县| 台江县| 清涧县| 瓦房店市| 瓮安县| 洪泽县| 中西区| 潮安县| 甘孜县| 宝丰县| 武强县| 高要市| 峨边| 曲沃县| 休宁县| 鹤壁市| 德令哈市| 寿宁县| 肥西县| 象州县| 青阳县| 山西省| 孟津县| 巴塘县| 筠连县| 虹口区| 崇明县| 多伦县| 潮安县| 高平市| 寻甸| 台前县| 曲麻莱县| 沛县| 浦江县| 商洛市| 龙胜| 通江县| 韩城市| 抚松县|