程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SpringMVC+MyBatis聲明式事務治理

SpringMVC+MyBatis聲明式事務治理

編輯:關於JAVA

SpringMVC+MyBatis聲明式事務治理。本站提示廣大學習愛好者:(SpringMVC+MyBatis聲明式事務治理)文章只能為提供參考,不一定能成為您想要的結果。以下是SpringMVC+MyBatis聲明式事務治理正文


采取的根本搭建情況: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> 
 <!-- 主動掃描組件,這裡要把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> 
 <!-- 掃描一切的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> 
 <!-- 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聲明式事務治理設置裝備擺設完成,並運轉准確
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved