@Transactional失效的一种业务场景

今天写的一个业务场景是批量导入,然后需要记录错误的数据,精确到某个单元格的记录,有重复数据或者单元格为空的就回滚,但是事务失效了。

我的业务逻辑:

》》插入所有数据 

》》在插的过程中记录哪些单元格为空或者重复数据就存在一个集合内 

》》 最后判断该集合是否为空,不为空就抛异常,正常抛异常事务就会回滚

正是因为需要返回这个错误集合,return 这个集合 就会把抛出的异常处理了,导致@Transactional回滚失效

由于我是同时导入两张表,里面的逻辑比较繁琐,后面4个单元格是另一张表,需查重

后来在捕获异常的地方加入以下代码,就可以事务就可以正常回滚了。

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

 /**
     * @author: JiaXinMa
     * @description: 批量导入
     * @date: 2021/4/21
     */
    public List<ImportDto> saveOwnerRoom(MultipartFile file, Integer communityId) {
        List<ImportDto> importDtoList = new ArrayList<>();//存空单元格的集合
        try {
            XSSFWorkbook workbook;

            File files = new File(System.getProperty("user.dir"));//jar包父目录
            String path = files.getAbsolutePath() + "/upload/Excel/";

            List<List<String>> list = new ArrayList<>();//sheet页的所有行

            //1.判断该社区是否有单位
            List<CommunityUnitInfo> units = communityUnitServiceImpl.findAllUnits(communityId);

            boolean isExcel = ExcelUtil.isExcel(file.getOriginalFilename());
            String temporaryPath = path + file.getOriginalFilename();
            if (isExcel) {//判断是否为Excel文件
                File file1 = new File(path + "/" + file.getOriginalFilename());
                if (!file1.exists()) {
                    file1.mkdirs();
                }
                file.transferTo(file1);//生成批量导入 Excel文件
                workbook = new XSSFWorkbook(temporaryPath);
                ExcelUtil excelUtil = new ExcelUtil(workbook);
                list = excelUtil.read();
                //业主姓名--业主电话--证件号码--房产证编号--面积--栋--单元--层--房--厕所

                ComSCommunity community = null;//获取社区
                Optional<ComSCommunity> comSCommunity = comSCommunityRepository.findById(communityId);
                if (comSCommunity != null) {
                    community = comSCommunity.get();
                }

                if (CollectionUtils.isNotEmpty(list)) {
                    for (int i = 1; i < list.size(); i++) {//第一行为上面的字段,0不读取

                        List<String> cells = list.get(i);//excel的每一行
                        String unitXName = "";

                        CommunityRoom communityRoom = new CommunityRoom();//房源
                        BRoomOwner ownerRoom = new BRoomOwner();//业主
                        ownerRoom.setStatus(1);//默认设置业主的启用状态为启用:1
                        ownerRoom.setCommunityId(communityId);

                        communityRoom.setCommunityId(communityId);
                        communityRoom.setCommunityName(community.getCommunityName());
                        /*
                        //设置房源表单位对应的值
                        for (int z = 0; z < units.size(); z++) {
                            if (z == 0) {
                                unitXName += (cells.get(5) + ",");
                                communityRoom.setUnitA(cells.get(5));
                            } else if (z == 1) {
                                unitXName += (cells.get(6) + ",");
                                communityRoom.setUnitB(cells.get(6));
                            } else if (z == 2) {
                                unitXName += (cells.get(7) + ",");
                                communityRoom.setUnitC(cells.get(7));
                            } else if (z == 3) {
                                unitXName += (cells.get(8) + ",");
                                communityRoom.setUnitD(cells.get(8));
                            } else if (z == 4) {
                                unitXName += (cells.get(9) + ",");
                                communityRoom.setUnitE(cells.get(9));
                            } else if (z == 5) {
                                unitXName += (cells.get(10) + ",");
                                communityRoom.setUnitF(cells.get(10));
                            }
                        }
                        */
                        //设置房源表单位对应的值
                        for (int z = 0; z < units.size(); z++) {
                            if (z == 0) {
                                unitXName += (cells.get(5) +units.get(z).getName()+ ",");
                                communityRoom.setUnitA(cells.get(5)+units.get(z).getName());
                            } else if (z == 1) {
                                unitXName += (cells.get(6) + units.get(z).getName()+",");
                                communityRoom.setUnitB(cells.get(6)+units.get(z).getName());
                            } else if (z == 2) {
                                unitXName += (cells.get(7) +units.get(z).getName()+ ",");
                                communityRoom.setUnitC(cells.get(7)+units.get(z).getName());
                            } else if (z == 3) {
                                unitXName += (cells.get(8) + units.get(z).getName()+",");
                                communityRoom.setUnitD(cells.get(8)+units.get(z).getName());
                            } else if (z == 4) {
                                unitXName += (cells.get(9) +units.get(z).getName()+ ",");
                                communityRoom.setUnitE(cells.get(9)+units.get(z).getName());
                            } else if (z == 5) {
                                unitXName += (cells.get(10) + units.get(z).getName()+",");
                                communityRoom.setUnitF(cells.get(10)+units.get(z).getName());
                            }
                        }

                        //去除unitXName最后一个","
                        unitXName = unitXName.substring(0, unitXName.length() - 1);

                        for (int j = 0; j < cells.size(); j++) {
                            String cell = cells.get(j);
                            ImportDto importDto = new ImportDto();//存空单元格

                            if (j == 3) {//房产证编号可以为空
                                ownerRoom.setRoomNumber(cell);
                            } else {
                                if (cell == null || cell.length() <= 0) {
                                    importDto.setRow(i);
                                    importDto.setColumn(j);
                                    importDto.setMsg(list.get(0).get(j) + "不能为空!!!");
                                    importDtoList.add(importDto);//存空单元格的集合
                                } else {
                                    if (j == 0) {
                                        ownerRoom.setOwnerName(cell);
                                    } else if (j == 1) {
                                        ownerRoom.setOwnerPhone(cell);
                                    } else if (j == 2) {
                                        ownerRoom.setCardTypeId(1);//默认设置为身份证:1
                                        ownerRoom.setPapersNumber(cell);
                                        /*校验身份证合法性
                                        if (IdCardUtil.isValidatedAllIdcard(cell)) {//判断证件号是否正确
                                            ownerRoom.setCardTypeId(1);//默认设置为身份证:1
                                            ownerRoom.setPapersNumber(cell);
                                        } else {
                                            importDto.setRow(i);
                                            importDto.setColumn(j);
                                            importDto.setMsg(list.get(0).get(j) + "格式错误!!!");
                                            importDtoList.add(importDto);//存空单元格的集合
                                        }
                                        */
                                    } else if (j == 4) {
                                        communityRoom.setArea(Double.parseDouble(cell));
                                    }
                                }
                            }

                        }

                        //验证房源是否存在
                        CommunityRoom room = communityRoomServiceImpl.findAllRoomName(unitXName, communityId);
                        if (room == null) {
                            //添加房源
                            communityRoomDao.save(communityRoom);
                            //获取刚添加的房源
                            room = communityRoomServiceImpl.findAllRoomName(unitXName, communityId);
                            ownerRoom.setRoomId(room.getRoomId());//设置房源id
                            //添加业主表
                            ownerRoomRepository.save(ownerRoom);
                            //获取刚添加的业主
                            BRoomOwner bRoomOwner = ownerRoomRepository.findByRoomId(room.getRoomId());
                            //更新刚添加的房源
                            room.setOwnerId(bRoomOwner.getId());//设置业主id
                            communityRoomDao.save(room);
                        } else {
                            ImportDto importDto = new ImportDto();
                            importDto.setRow(i);
                            importDto.setMsg("该房源已存在!!!");
                            importDtoList.add(importDto);//存空单元格的集合
                        }

                        //判断是否有存在空的或者重复数据
                        if (i == list.size() - 1 && CollectionUtils.isNotEmpty(importDtoList)) {
                            throw new MdException(500, "有重复数据或者单元格为空的就回滚");
                        }
                    }
                }
            }
        } catch (IOException e) {
            //transferTo  文件导入失败
            throw new MdException(500, "文件导入失败");
        } catch (Exception e) {
            //list   文件读取失败
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return importDtoList;
    }

 

想看更多精彩内容,可以关注我的CSDN

我的CSDN

posted @ 2021-04-21 19:55  Yblue  阅读(94)  评论(0编辑  收藏  举报