spring事务管理,for循环删除数据时,如果有一条失败则回滚一条数据

场景:单个删除时,需要提示具体删除失败的原因;批量删除时,需要提示删除失败总数。单个删除A和批量删除B都调用同一个方法C,区别是单个删除时传入的业务id放到list中再调用删除方法,这样后续删除如果有改动只需要改删除方法C就行,不需要改动A和B。为了保持事务一致,需要在A和B方法上添加注解@Transactional。C方法上可以不添加。代码如下:

方法A:

java 复制代码
@Transactional
    @Override
    public void remove(Long id) {
        List<Long> businessIds = Collections.singletonList(id);
        RemoveDto removeDto = getRemoveDto( businessIds);;
        if(!CollectionUtils.isEmpty(removeDto.getErrorData())){
            
            throw new Exception("删除失败");
        }
    }

方法B:

java 复制代码
@Transactional
    @Override
    public RemoveDto removeBatch(List<Long> ids) {

        return getRemoveDto(ids);
    }

方法C:

java 复制代码
private RemoveDto getRemoveDto(List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)){
            throw new Exception( "请求参数不能为空");
        }

       

        int success = 0;
        int fail = 0;

        for (Long id: ids) {
            Object savePoint = null;
            try {
                //设置回滚点
                savePoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
                
                remove(id);//该方法只是删除数据和相关的业务逻辑,方法也不需要添加@Transactional,同时该方法和方法C可以不在同一个类中
               
                success++;
            }catch (Exception e){
                fail++;

                log.error("系统异常删除原因:"+ JSON.toJSONString(e));
               
                if (savePoint != null) {
                    //回滚
                    TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
                }
            }
        }
        
        return RemoveDto.builder().successCount(success).failCount(fail).build();
    }

经过上述操作,可以在使用for循环删除数据时,如果有一条删除失败,会回滚失败的数据,并且不影响已经删除成功的数据和未删除的数据。

相关推荐
Slow菜鸟6 分钟前
SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(多数据源配置)
spring boot·分布式·后端
乌南竹16 分钟前
Spring Boot应用开发
spring
Dymc20 分钟前
【安装JDK和Android SDK】
android·java·jdk·sdk
不是二师兄的八戒21 分钟前
解析文件(支持 TXT、PDF、JPG、PNG、DOCX),并提取体检数据中的数值
java·php
霍金的微笑30 分钟前
JAVA Web(学习笔记)
java·前端·学习
逗逼撞地球42 分钟前
DAY3 JAVA基本语法
java
职场人参1 小时前
视频声音怎么去除?高效的视频声音去除方法
java·服务器·数据库
任错错1 小时前
flink-jdbc-driver
java·大数据·mysql·flink
@See you later1 小时前
IDEA连接Docker(远程)
java·docker·intellij-idea
那你为何对我三笑留情1 小时前
三、Spring Boot集成Spring Security之securityFilterChain过滤器链详解
java·spring boot·spring·spring security·过滤器链