在MyBatis配置文件spring-mybatis.xml配置数据源及支持注解事务及事务的代理方式
- proxy-target-class="true" 事务注解可配置在实现类方法上,需要CGLIB支持
- proxy-target-class="false" 事务注解配置在接口上,使用默认的JDK代理支持
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:/mapping/sixone/*Mapper.xml"/>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dao.sixone" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 注解方式配置事物 -->
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />
在Spring MVC配置文件spring-mvc.xml配置扫描包方式包括待事务注解的Service,默认Spring MVC扫的是原生Service。
<!-- 自动扫描controller包下的所有类,使其认为spring mvc的控制器 -->
<context:component-scan base-package="com.controller" >
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
在带有@Service注解的类中写事务方法,然后调用尽量不要在该类中调用,不要在事务方法try{}catch{},而是去外层捕获这样才会回滚,这里指定了回滚异常Exception.class。
注意:方法必须public
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = false)
public int savePayNotice(JDCreateOrder payOrder) throws Exception {
return createOrderMapper.updateOrderByOrderNo(payOrder);
}
最后调用:
try {
int count = savePayNotice(payOrder);
if (count>0) {
//ok
} else {
return;
}
} catch (Exception e) {
return;
}