@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