Spring Transaction Rollback

在使用编程方式进行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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值