spring事务传播-记一次this导致事务失效的问题

4 篇文章 0 订阅
3 篇文章 0 订阅

遇到一个问题:
service类批量保存方法(addBatch)遍历list调用单个保存方法(add)进行批量保存,要求批量保存方法在遍历单个保存时有单个保存失败时不回滚整个批量保存方法,只回滚单个保存并记录。在批量保存方法中调用单个保存方法(add)时没有使用自我注入的bean调用,导致单个保存方法(add)的事务失效没有回滚。实例代码如下:
错误代码:

@Service
public class EntityServiceImpl extends ServiceImpl<EntityMapper, Entity>
    implements IEntityService {

	/** 
	*单一新增方法
	*/
    @Override
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.NESTED)
    public void add(TamRepairTireVO entity) {
        this.save(entity);
        // todo 下方逻辑代码可能会抛出异常
    }

	/** 
	*批量新增方法
	*/
    @Override
    @Transactional(rollbackFor = Exception.class)
    public String addBatch(List<TamRepairTireVO> entityVoS) {

        int sucCount=0;//成功条数
        int failCount=0;//失败条数
        StringBuffer error= new StringBuffer();
        for(EntityVO entityVO:entityVoS)
        {

            try {
            	// 问题点出在这里,this调用add方法导致add方法的事务注解失效了,所以add中报错时不会回滚
                this.add(entityVO);
                sucCount++;
            }catch (Exception ex)
            {
                failCount++;
                error.append("<br/>").append(failCount).append("失败:").append(ex.getMessage());
            }
        }
        return  "导入成功"+sucCount+"条,导入失败"+failCount+"条。"+error.toString();
    }
    
   }

正确写法:

@Service
public class EntityServiceImpl extends ServiceImpl<EntityMapper, Entity>
 implements IEntityService {
 @Autowired
 @Lazy
 IEntityService self;
 /** 
 *单一新增方法
 */
 @Override
 @Transactional(rollbackFor = Exception.class, propagation = Propagation.NESTED)
 public void add(TamRepairTireVO entity) {
     this.save(entity);
     // todo 下方逻辑代码可能会抛出异常
 }

 /** 
 *批量新增方法
 */
 @Override
 @Transactional(rollbackFor = Exception.class)
 public String addBatch(List<TamRepairTireVO> entityVoS) {

     int sucCount=0;//成功条数
     int failCount=0;//失败条数
     StringBuffer error= new StringBuffer();
     for(EntityVO entityVO:entityVoS)
     {

         try {
         	// 问题点出在这里,this调用add方法导致add方法的事务注解失效了,所以add中报错时不会回滚
         	// 使用自我调用的self对象调用add方法即可正确的单独回滚add方法了
             self.add(entityVO);
             sucCount++;
         }catch (Exception ex)
         {
             failCount++;
             error.append("<br/>").append(failCount).append("失败:").append(ex.getMessage());
         }
     }
     return  "导入成功"+sucCount+"条,导入失败"+failCount+"条。"+error.toString();
 }
 
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值