Spring的事务控制

Spring的事务控制让我们从复杂的事务处理中得到解脱,是我们再也不需要去处理获得连接,关闭连接,事务提交和回滚等操作,再也不需要在事务相关的方法中处理大量的try..catch...finally代码。

我们先看下Spring中的事务控制代码:

	<tx:annotation-driven transaction-manager="transactionManager"/>
	<bean id="transactionManager" class="org.Springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dbcp"/>
	</bean>
	
	<util:properties id="db" location="classpath:db.properties">
	</util:properties>
	<bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource">
	  <property name="username" value="#{db.user}"></property>
	  <property name="password" value="#{db.pwd}"></property>
	  <property name="driverClassName" value="#{db.driver}"></property>
	  <property name="url" value="#{db.url}"></property>
	</bean>
	
	<bean id="sqlsessionfactory"
	class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dbcp"></property>
	<property name="mapperLocations"
	value="classpath:org/tarena/note/sql/*.xml">
	</property>
	</bean>

MyBatis自动参与到Spring的事务管理中,无需额外配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可,否则事务管理会不起作用。同时不要忘记配置Spring-tx的命名空间。

上述方法是一种事务控制,但是比较麻烦,它需要你在需要做事务控制的实现类上加上,@Transaction注解。还有一种配置方式,是关于Springmvc-Mybatis自动扫描的,代码如下:

 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
 <property name="dataSource" ref="dataSource" /> 
 </bean> 
 <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> 
 <aop:config> 
 <aop:pointcut id="fooServiceMethods" 
 expression="execution(* com.sence.*.service.impl.*.*(..))"/>  
 <aop:advisor advice-ref="txAdvice" pointcut-ref="fooServiceMethods"/>  
 </aop:config> 

这种方式比较流行,因为他不需要加自动扫描注解的@transaction注解。只需要配置Spring文件,然后可以针对各个方法进行只读或者更改数据库配置。


但我们后面讨论的内容,是以第一种方法的源码为基础的。因为第一种是Spring事务控制的基础,第二种是在第一种的基础上操作的。此处有一点需要注意:

默认情况下Spring中的事务处理只对RuntimeExcpetion方法进行回滚


事务自定义标签

对于Spring中事务功能的代码,配置文件中有这样一个配置:<tx:annotation-driven/>。这个是事务的开关,如果这个配置,Spring中不存在事务功能。我们从这个事务进行分析看看。

使用关键字“annotation-driven”搜索全局代码,我们锁定 了TxNamespaceHandler中的init方法:

	public void init() {
		registerBeanDefinitionParser("advice", new TxAdviceBeanDefinitionParser());
		registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
		registerBeanDefinitionParser("jta-transaction-manager", new JtaTransactionManagerBeanDefinitionParser());
	}

这里解析了spring事务控制的三种配置方式。从以上代码可以知道,在遇到<tx:annotation-driven>为开头的配置时,Spring就是使用AnnotationDrivenBeanDefinitionParse类进行解析。其他也相似。关于源码,说实话,这一块我觉得是没有什么好分析的,所以自己也没有深入分析过。大家可以这样理解spring的事务控制。即:

比如有一个方法为saveHerName()方法。

加上事务控制后变成了这样(Spring的事务都是以AOP的方式实现的,这是基础大家需要理解):

con.setAutoCommit(false);

try{

       saveHerName()

       con.commit();

} catch(RunTimeExcpetion e){

       con.rollback();

}

因为我遇到的事务控制的问题并不多,所以对事务控制的源码没有进行过深入理解,有兴趣的可以去网上搜下资料看下。后面,我们重点一起分析SpringMVC,这是spring项目的核心框架,也是我们理解项目的基础框架。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值