java 多线程 事务_Java 多线程事务回滚 ——多线程插入数据库时事务控制()

本文介绍了一个Java应用中如何通过多线程并发插入数据库并控制事务的场景。当某一线程异常或结果不符合预期时,全部事务回滚。通过CountDownLatch和线程池实现并发,同时使用自定义的RollBack类来协调回滚操作。
摘要由CSDN通过智能技术生成

背景

日常项目中,经常会出现一个场景,同时批量插入数据库数据,由于逻辑复杂或者其它原因,我们无法使用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 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 &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值