Spring : 征服数据库 (四)

本文主要介绍Spring 和 MyBatis整合的事务处理。

值得一提的是,你不需要为MyBaits单独创造一个事务管理器,MyBatis-Spring可以使用针对JDBC的DataSourceTransactionManager来管理事务,不像Hibernate,有其自己的事务管理器。

首先,你去定义一个事务管理器,

<bean id="transactionManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

这里的dataSource和你在定义SqlSessionFactoryBean时所引用的dataSource必须是一样的,否则事务管理不起作用。

一旦配置好事务管理器,就可以在Spring里按Spring的方式去配置,不论你喜欢声明式的配置或AOP的方式。


在早期的Spring版本,定义事务是很麻烦的,因为使用快废弃的TransactionProxyFactoryBean会使配置文件特别臃肿。现在,Spring提供了一个tx的命名空间,简化了配置。(同时也得引入aop命名空间,因为在有一些事务会依赖它)

	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx= "http://www.springframework.org/schema/tx"


我们知道,描述一个事务需要五个维度:(来自Spring实战第三版)

传播行为(propagation): 定义客户端和被调用方法的事务边界。也就是方法是否该在一个事务环境里运行。Spring定义了7个:

Spring : 征服数据库 (四)

第二个是隔离等级,第三个只读(是否为只读事务),第四个是事务超时,最后一个是回滚规则。

这些都是事务本身的知识点,这里不展开讨论。


Spring使用<tx-advice>来定义事务策略。如下:

<tx:advice id="txadvice"
           transaction-manager="txManager">
<tx:attributes>
   <tx:method name="save*" propagation="SUPPORTS"
       read-only="true" />
</tx:attributes>

</tx:advice>

在定义的attributes下面可以定义若干method,method可以指定上面提到的事务的五个维度。

另外,<tx-advice>的transaction-manager是事务管理器的ID,默认是transactionManager。

但上面的描述是不完全的,因为它只是定义的AOP的通知,没有指出哪些Bean被通知;这时需要定义一个切点,并且引用txadvice。(详细的AOP编程的细节这里也不展开)。


如果你不会AOP的写法,可能会一头雾水,不要紧,Spring还支持声明的事务管理。

<tx:annotation-driven transaction-manager="..." />

就这么一句话就够了,如果事务管理器的iD恰好是transactionManager,就可简写成:

<tx:annotation-driven />

接下来就可以在类和方法前添加@Transaction注解。

@Transactional
	public void getSpitterByEmail(String email){

你可以在Transactional里面指定readOnly等属性.

文章的最后我们给出其默认属性:

Propagation.REQUIRED

Isolation.DEFAULT

false (readOnly)

-1 (超时)


Spring : 征服数据库 (四)

上一篇:MySQL 跳过同步错误方法


下一篇:笔试面试那件小事(数据库知识)