在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; }