本文主要介绍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"
传播行为(propagation): 定义客户端和被调用方法的事务边界。也就是方法是否该在一个事务环境里运行。Spring定义了7个:
第二个是隔离等级,第三个只读(是否为只读事务),第四个是事务超时,最后一个是回滚规则。
这些都是事务本身的知识点,这里不展开讨论。
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 (超时)