激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - SpringMVC+MyBatis聲明式事務(wù)管理

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

2020-01-03 14:27hebedich JAVA教程

在最近的一個(gè)項(xiàng)目中,采用springMVC、mybatis,MySQL、tomcat,事務(wù)管理對(duì)于企業(yè)應(yīng)用來說是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性。Spring Framework對(duì)事務(wù)管理提供了一致的抽象,

采用的基本搭建環(huán)境:SpringMVC、MyBatis、MySQL、tomcat
        Spring事務(wù)管理分解了傳統(tǒng)的全局事務(wù)管理和本地事務(wù)管理的劣勢(shì),使得在任何環(huán)境中都可以使用統(tǒng)一的事務(wù)管理模型,你可以寫一次代碼,然后在不同的環(huán)境從你的代碼里面配置不同的事務(wù)管理策略,Spring提供兩種事務(wù)管理策略:一種是聲明式事務(wù)管理策略,另一種是編程式事務(wù)管理策略,這里主要介紹聲明式事務(wù)管理策略
由于采用的是SpringMVC、 MyBatis,故統(tǒng)一采用了標(biāo)注來聲明Service、Controller
由于服務(wù)器啟動(dòng)時(shí)的加載配置文件的順序?yàn)閣eb.xml---root-context.xml(Spring的配置文件)---servlet-context.xml(SpringMVC的配置文件),由于root-context.xml配置文件中Controller會(huì)先進(jìn)行掃描裝配,但是此時(shí)service還沒有進(jìn)行事務(wù)增強(qiáng)處理,得到的將是原樣的Service(沒有經(jīng)過事務(wù)加強(qiáng)處理,故而沒有事務(wù)處理能力),所以我們必須在root-context.xml中不掃描Controller,配置如下:
?
1
2
3
4
5
6
7
8
<!-- 自動(dòng)掃描組件,這里要把controler下面的 controller去除,他們是在spring3-servlet.xml中配置的,如果不去除會(huì)影響事務(wù)管理的。  -->
 <context:component-scan base-package="com.sence">
 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
 .</context:component-scan>
 <!-- 自動(dòng)掃描組件,這里要把controler下面的 controller去除,他們是在spring3-servlet.xml中配置的,如果不去除會(huì)影響事務(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同時(shí)不掃描Service,配置如下:
 
?
1
2
3
4
5
6
7
8
9
10
<!-- 掃描所有的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>
下面就可以進(jìn)行配置聲明式事務(wù)管理了,配置如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<!-- 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)過我的測(cè)試,當(dāng)我往MySQL數(shù)據(jù)庫表批量增加對(duì)象時(shí),當(dāng)其中一個(gè)對(duì)象出現(xiàn)錯(cuò)誤,拋出CustomException事務(wù)卻不回滾,這個(gè)真是令人頭疼,于是我繼續(xù)查找,步驟如下:
1. 查找是否聲明式事務(wù)管理有誤,如切入點(diǎn)寫錯(cuò)了
2. 查找Controller掃描部分配置是否正確
但是這兩點(diǎn)我都查了,還是事務(wù)沒有回滾,這個(gè)時(shí)候我沒辦法了,只能動(dòng)用終極武器了:查看源碼,開始debug程序,發(fā)現(xiàn)進(jìn)入到了事務(wù),并且出現(xiàn)了異常,捕獲后進(jìn)入到了回滾程序,但是數(shù)據(jù)庫卻沒有回滾,為了避免Spring自己的AbstractPlatformTransactionManager的干擾,我自己定制了一個(gè)事務(wù)管理類并繼承配置文件中的DataSourceTransactionManager類,這樣可以清楚的看到程序的運(yùn)行軌跡,繼續(xù)DEBUG,還是出現(xiàn)了異常,捕獲后進(jìn)入到了回滾程序,但是數(shù)據(jù)庫卻沒有回滾,此刻我開始懷疑MySQL數(shù)據(jù)庫的事務(wù)支持功能了,于是網(wǎng)上查找MySQL對(duì)事務(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,然后運(yùn)行程序發(fā)現(xiàn)事務(wù)回滾了
到此SpringMVC聲明式事務(wù)管理配置完成,并運(yùn)行正確

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜视频福利 | 91看片在线看 | 在火车上摸两乳爽的大叫 | 91精品国产乱码久久桃 | 久久精品视频亚洲 | 色毛片 | 国产一区二区国产 | 国产一区二区三区视频观看 | 中文字幕在线免费 | 激情av在线| 亚洲成人福利在线 | 免费毛片观看 | 欧美一级淫片免费视频黄 | chinese军人gay呻吟 | 亚洲网站免费 | 国内精品伊人久久久久网站 | 久久午夜国产 | 国产精品久久久av | 国产精品亚洲精品日韩已方 | 欧美日韩在线视频一区 | av电影在线观看网址 | 亚洲成人激情在线 | 国产在线观看免费视频软件 | 国产91在线播放九色 | 福利在线国产 | 一级毛片免费高清视频 | 国产乱淫a∨片免费观看 | 国产精品久久亚洲 | 成人午夜淫片a | 九九热视频在线免费观看 | 亚洲视频成人 | 久久国精品 | 日韩黄a| 国产一区二区三区撒尿在线 | 男女污污视频网站 | 欧美成人精品一级 | 九九热精品视频在线 | 久久一本日日摸夜夜添 | 女人叉开腿让男人桶 | 久久精品探花 | 久久久久久久九九九九 |