基于注解的spring的声明式事务配置:
<span style="white-space:pre"> </span><!-- 全注解Sping事务管理配置(@Transactional(rollbackFor = Exception.class)) -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<span style="color:#ff0000;"><property name="dataSource" ref="dataSource" /></span>
</bean>
<!--启动spring事物注解驱动-->
<tx:annotation-driven transaction-manager="txManager"/>
<span style="white-space:pre"> </span><!-- MyBatis配置,只要org.mybatis.spring.SqlSessionFactoryBean引用的数据源与DataSourceTransactionManager引用的数据源一致即可(红色部分)-->
<bean id="sqlSessionFactoryBean" class="com.kev.team.framework.dao.mybatis.SqlSessionFactoryBean">
<span style="color:#ff0000;"><property name="dataSource" ref="dataSource" /></span>
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
<!-- 需要映射的包路径 -->
<property name="typeAliasesPackage" value="com.kev.team.**" />
<property name="mapperLocations">
<list>
<value>classpath:com/kev/team/**/*Mapper.xml</value>
</list>
</property>
</bean>
<!-- 添加tx命名空间 -->
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
使用实例:
@Transactional
public void insertStyle(GoodsDetail goodsDetail) {
Goods goods = goodsDao.selectByNo(goodsDetail.getGoodsNo());
List<GoodsDetail> detail = goodsDao.getGoodsDetailByGoodsNo(goodsDetail.getGoodsNo());
int flag = 0, flag1 = 0;
String goodsStyleIds = goods.getGoodsStyleIds();
if (goodsStyleIds == null) {
goods.setGoodsStyleIds(goodsDetail.getGoodsSizeId() + "," + goodsDetail.getGoodsColorId());
} else {
goods.setGoodsStyleIds(goodsStyleIds + "," + goodsDetail.getGoodsSizeId() + ","
+ goodsDetail.getGoodsColorId());
}
int styleStock = goodsDetail.getGoodsStock();
for (int i = 0; i < detail.size(); i++) {
styleStock += detail.get(i).getGoodsStock();
}
if (goods.getGoodsstock() >= styleStock) {
flag = goodsDao.insertStyle(goodsDetail);
flag1 = goodsDao.updateByPrimaryKey(goods);
if ((flag + flag1) != 2) {
throw new RuntimeException("事务发生回滚,请检查颜色尺码数据是否正确!!");
}
} else {
throw new RuntimeException("库存不足,请调整数量!!");
}
}
添加@Transactional注解的方法,相当于在方法开始前添加事务开始代码,在方法结束后添加事务结束代码,
所以该方法必须抛出异常到方法结束处,事务才会回滚。
异常可以在方法调用处try catch,以得到程序需要的适当返回。