@Override @Transactional(rollbackFor = Exception.class) public ResponseVo importData(InputStream inputStream, String originalFilename) { // 导入数据要分批次导入,每次导入量为1000条(防止数据量过大) int count = 1000; int lastIndex = count; // 需要导入的结果集合 List resultList = new ArrayList<>(); // 插入数据库成功总数 Integer successCount = 0;

try {
    List<List<Object>> dataByExcel = getDataByExcel(inputStream, originalFilename);

    if (CollectionUtils.isEmpty(dataByExcel)) {
        return new ResponseVo(false, '您的表中没有数据或者数据不符合校验规则,请检查!', ErrorCode.DATABASE_ERROR, null);
    }

    for (int i = 0; i < dataByExcel.size(); i++) {
        KnowledgeBaseData data = new KnowledgeBaseData();
        //类别名称
        String labelName = String.valueOf(dataByExcel.get(i).get(1));
        //匹配类别id
        Integer integer = knowledgeBaseLabelDao.queryLabelIdByLabelNameInteger(labelName);
        if (integer == null) {
            //新增类别
            KnowledgeBaseLabel label = new KnowledgeBaseLabel();
            label.setLabelSource('系统新增');
            label.setLabelName(labelName);
            int id = knowledgeBaseLabelDao.insertSelective(label);
            data.setLabelId(id);
        } else {
            data.setLabelId(integer);
        }
        //商品名称
        data.setCommodityName(String.valueOf(dataByExcel.get(i).get(2)));
        //商品编码
        data.setCommodityCode(String.valueOf(dataByExcel.get(i).get(3)));
        //编撰人
        data.setCreateBy(String.valueOf(dataByExcel.get(i).get(4)));
        //编撰时间
        data.setCreateTime(new SimpleDateFormat('yyyy-MM-dd').parse(String.valueOf(dataByExcel.get(i).get(5))));
        //问题
        data.setKnowledgeTitle(String.valueOf(dataByExcel.get(i).get(6)));
        //答案
        data.setKnowledgeAnswer(String.valueOf(dataByExcel.get(i).get(7)));
        //备注
        data.setRemarks(String.valueOf(dataByExcel.get(i).get(8)));
        // 将结果装入我们的集合中
        resultList.add(data);
    }

    // 将resultList中的数据拆分为多个list。
    List<List<KnowledgeBaseData>> groupingList = getGroupingList(resultList, count);

    if (!CollectionUtils.isEmpty(groupingList)) {
        for (int i = 0; i < groupingList.size(); i++) {
            // 插入数据库
            successCount = successCount + knowledgeBaseDataDao.insertBatch(groupingList.get(i));
        }
    }

    return new ResponseVo(true, '本次导入数据库成功:' + successCount + ' 条', ErrorCode.SUCCESS, null);
} catch (Exception e) {
    e.printStackTrace();
    // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
    return new ResponseVo(false, '导入数据失败,请重试!', ErrorCode.DATABASE_ERROR, null);
}

}

// 错误信息解释: // 错误 "org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only" 表示事务已被标记为回滚。 // 这通常发生在事务中发生异常且事务管理器决定回滚事务时。

// 在您的代码中,代码行 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 明确地将事务标记为回滚。 // 这意味着在事务中进行的任何更改都将被回滚。

// 为了解决此问题,您应该删除代码行 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 或者以不同的方式处理异常, // 该方式不会将事务标记为回滚。确保以适当的方式处理任何异常,并根据您的业务逻辑决定是否回滚事务。

// 此外,您还应检查日志或异常消息,以确定触发回滚的异常原因。 // 这将帮助您识别和修复导致意外回滚的根本问题。


原文地址: https://www.cveoy.top/t/topic/pmof 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录