Bootstrap

Java 多线程事务回滚 ——多线程插入数据库时事务控制

背景

日常项目中,经常会出现一个场景,同时批量插入数据库数据,由于逻辑复杂或者其它原因,我们无法使用sql进行批量插入。串行效率低,耗时长,为了提高效率,这个时候我们首先想到多线程并发插入,但是如何控制事务呢 … 直接上干货

实现效果
  • 开启多条子线程,并发插入数据库
  • 当其中一条线程出现异常,或者处理结果为非预期结果,则全部线程均回滚
代码实现
@Service
public class CompanyUserBatchServiceImpl implements CompanyUserBatchService {
    private static final Logger logger = LoggerFactory.getLogger(CompanyUserBatchServiceImpl.class);

    @Autowired
    private CompanyUserService companyUserService;

    @Override
    public ReturnData addNewCurrentCompanyUsers(String params) {
        logger.info("addNewCompanyUsers 新增参保人方法");
        logger.info(">>>>>>>>>>>>参数:{}", params);
        ReturnData rd = new ReturnData();
        rd.setRetCode(CommonConstants.RETURN_CODE_FAIL);
        if (StringUtils.isBlank(params)) {
            rd.setMsg("入参为空!");
            logger.info(">>>>>>入参为空。");
            return rd;
        }

        List<CompanyUserResultVo> companyUsers;
        try {
            companyUsers = JSONObject.parseArray(params, CompanyUserResultVo.class);
        } catch (Exception e) {
            logger.info(">>>>>>>>>入参格式有误: {}", e);
            rd.setMsg("入参格式有误!");
            return rd;
        }


        //每条线程最小处理任务数
        int perThreadHandleCount = 1;
        //线程池的最大线程数
        int nThreads = 10;
        int taskSize = companyUsers.size();

        if (taskSize > nThreads * perThreadHandleCount) {
            perThreadHandleCount = taskSize % nThreads == 0 ? taskSize / nThreads : taskSize / nThreads + 1;
            nThreads = taskSize % perThreadHandleCount == 0 ? taskSize / perThreadHandleCount : taskSize / perThreadHandleCount + 1;
        } else {
            nT
;