Spring是通过org.springframework.transaction.PlatformTransactionManager接口来实现事务的管理。同时应对不同的场景,提供不同的PlatformTransactionManager实现类来实现管理事务。下面是常见的应用场景。
如果使用JDBC来进行数据持久化,Spring使用DataSourceTransactionManager类来实现事务管理(mybatis也可以使用JDBC的事务管理,mybatis的事务机制在下延伸中讲解)。Spring配置如下
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
如果使用Hibernate来进行数据持久化,Spring使用HibernateTransactionManager类来实现事务管理。Spring配置如下
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
MyBatis的事务管理分为两种形式:
Spring除了jdbc的四种事务读未提交ISOLATION_READ_UNCOMMITTED
、读已提交ISOLATION_READ_COMMITTED
、可重复读ISOLATION_REPEATABLE_READ
、串行化ISOLATION_SERIALIZABLE
以外,还有ISOLATION_DEFAULT
,即使用数据库默认事务隔离级别。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven order="1" proxy-target-class="true"/>
<tx:advice id="transactionAdvice">
<tx:attributes>
<tx:method name="*" isolation="READ_COMMITTED" rollback-for="Exception"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="transactionPointcut" expression="execution(* com.lc.service..*Service.*(..))"/>
<aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" order="2"/>
</aop:config>
Spring的事务传播行为有一下7种
事务传播行为的理解,事务是可以嵌套的,如一个方法存在事务,它调用一个方法也存在事务,如果调用的方法的事务是REQUIRED时,调用的方法不会新建事务,而是使用老的事务;如果调用方法的事务是REQUIRESNEW时,调用的方法会新建事务,而之前的事务会挂起,等这个方法结束再调用,不过这会导致事务不同步,即内部方法成功了,没有回滚,外部方法失败回滚了。
@Transactional(readOnly = true, propagation=Propagation.REQUIRED)
public List<User> select(){
return userMapper.select();
}
@Transactional(readOnly= true, propagation= Propagation.REQUIRES_NEW)
public int delete(Integer id){
return userMapper.delete(id);
}