遇到一个问题:
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();
}
}