在使用编程方式进行spring的事务处理时,无需太考虑这个问题,可以再代码中显示的写上commit,rollback。
这里讨论的是如何在使用了aop进行spring事务管理如何进行事务回滚,也就是具体分析事务回滚的时机。
Spring的AOP事务管理默认是针对unchecked exception回滚,也就是默认对RuntimeException()异常极其子类进行事务回滚。关于unchecked exception和checked exception的区别和联系,可以参见我的另外一篇博客。
很显然,如果我们需要在代码片段中进行事务回滚,则只需要抛出RuntimeException或者其子类,举例说明:
客户下单扣除库存的时候,为了防止出现超卖现象(库存出现负数),会在扣除库存后进行查询,如果这时候发现了超卖现象,则进行事务回滚:
定义错误类:
public class NoGoodsStockException extends RuntimeException{
/**
*
*/
private static final long serialVersionUID = 8861593134653710729L;
public String goodsName;
public NoGoodsStockException(){
super();
}
public NoGoodsStockException(String goodsName) {
super("产品["+goodsName+"]库存不足,无法提交订单!");
this.goodsName = goodsName;
}
}
调用:
warehouseGoodsStock = warehouseGoodsStockMapper.queryById(warehouseGoodsStock.getId());
if (warehouseGoodsStock.getGoodsNumber() < 0) {
throw new NoGoodsStockException(warehouseGoodsStock.getGoodsName());
}
另外一种方式,就是在spring的配置文件中定义rollback-for参数,定义需要回滚的错误,这里则不需要一定是unchecked exception,个人不太喜欢这种方式。因为如果业务变动,需要更改配置文件比较麻烦。直接使用aop进行spring事务管理机制更加清晰明朗。
举例说明:
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" rollback-for="com.cn.untils.exception.***Exception"/>
</tx:attributes>
</tx:advice>