SSM對於事務的管理,基於註解

spring配置文件:

<!--不掃描controller-->
context:component-scan
		base-package="com.xx">
		<context:exclude-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
		<context:exclude-filter type="annotation"
			expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>

SpringMVC配置文件:

<!-- 自動掃描該包,SpringMVC只掃描controllerr -->
<context:component-scan
		base-package="com.xx.controller">
		<context:include-filter type="annotation"
			expression="org.springframework.stereotype.Controller" />
		<context:include-filter type="annotation"
			expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>

Spring-Mybatis配置文件:

<!-- 配置事務管理器 -->
<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置基於註解的聲明式事務 @Transactional -->
<!--proxy-target-class="true"表示支持CGLB代理,如果不加,只支持JDK的代理,默認只支持面向接口,也就是說放在實現類上,事務不生效-->
<tx:annotation-driven
	transaction-manager="transactionManager" proxy-target-class="true" />

 

爲什麼要分開配置spring 和 SpringMVC的掃描?

 

因爲spring的context是父子容器,ContextLoaderListener監聽器加載spring配置文件,

產生的是父容器,mvc加載mvc的配置文件,產生了子容器,子容器對@Controller進行裝配掃描時,

也裝配了@Service註解的實例,因爲在@Contoller實例依賴@Service實例,而@Service註解的實例,

也就是一般的事務控制層,應該是有父容器初始化,以保證事務的增強處理,否則會事務事務處理能力。

 

XxserviceImpl:

        //在catch中有兩種處理方法,1.拋出去異常,讓controllerAdvice處理.
        //2.手動回滾,下面例子爲手動回滾
        //該註解可配置在類,方法上。作用域public
    @Override
	@Transactional(rollbackFor = Exception.class)
	public void deleteLineAndTowerById(String id) {
		try {
			aaMapper.deleteById(id);
			int i = 5 / 0;
			bbMapper.deleteById(id);
		} catch (Exception e) {
			log.error("錯誤信息:" + e);
			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
		}
	}

注意:InnoDB引擎支持事務,在my.ini中的【mysqlId】下添加default-storage-engine=INNODB

具體的事務類型在public enum Propagation 枚舉中,默認爲Required

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章