天天看点

SpringBoot独立事物控制以及异常问题

前言

再myfalse github中有spring控制的独立事物,这里是springBoot我们用下注解采用的独立事物

1、新开启一个事物

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void keyTransactional(CouponItemGood couponItemGood) {

}      

2、解释

REQUIRED,注意,这是默认值,也即不进行该参数配置等于配置成REQUIRED。

2.1、REQUIRED的含义是,支持当前已经存在的事务,如果还没有事务,就创建一个新事务。

A调用B,假设调用aMethod前不存在任何事务,那么执行aMethod时会自动开启一个事务,而由aMethod调用bMethod时,由于事务已经存在,因此会使用已经存在的事务(也就是执行aMethod之前创建的那个事务)。

  对于这样的配置,如果bMethod过程中发生异常需要回滚,那么aMethod中所进行的所有数据库操作也将同时被回滚,因为这两个方法使用了同一个事务。

2.2、 REQUIRES_NEW的含义是,挂起当前事务,创建一个新事务,如果还没有事务,就简单地创建一个新事务。

首先,REQUIRES_NEW会创建一个与原事务无关的新事务,尽管是由一个事务调用了另一个事务,但却没有父子关系。

  如果bMethod的传播性是REQUIRES_NEW,而抛出了一个异常,则bMethod一定会被回滚,而如果aMethod捕获并处理了这个bMethod抛出的异常,那么aMethod仍有可能成功提交。当然,如果aMethod没有处理这个异常,那么aMethod也会被回滚。

  如果aMethod在bMethod完成后出现了异常,那么bMethod已经提交而无法回滚,只有aMethod被回滚了。

3、关于使用事物中嵌套REQUIRES_NEW 事物中出现的异常

Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnlyException 


外面的大事物中进行捕获为TransactionSystemException
try {
    keyTransactional.keyTransactional(couponItemGood);
    log.info(couponItemGood.getId().toString()+"已经检测");
}catch (AppException e){
    log.info(e.getMessage())
    continue;
}catch (TransactionSystemException e){
    log.info("小当优惠券中没有优惠券信息导致的,无须处理-多个事物开启了异常");
}catch (Exception e){
}