多线程事务-java的Lamda的parallelStream与事务
parallelStream与事务
parallelStream与steam的介绍不再赘述。关于使用多线程对数据处理是常见场景,事务也必不可少,遂此文出现。
场景:excel导入
使用EasyExcel进行数据入库,对数据校验较多,数据量较大,需要引入多线程。
//事务状态
List<TransactionStatus> transactionStatuses
= Collections.synchronizedList(new ArrayList<TransactionStatus>());
try{
EasyExcel.read(multipartFile.getInputStream(), A.class,
new AnalysisEventListener<A>() {
public void invoke(A object, AnalysisContext context) {
//业务
}
@Transactional
public void doAfterAllAnalysed(AnalysisContext context) {
log.info("验证数据准确性");
dataMap.entrySet().parallelStream().forEach(entry->{
//手动定义事务
DefaultTransactionDefinition def =
new DefaultTransactionDefinition();
TransactionStatus status =
transactionManager.getTransaction(def); // 获得事务状态
transactionStatuses.add(status);
//业务
});
log.info("数据入库完成");
}
}).sheet().doRead();
}catch (Exception e){
e.printStackTrace();
log.error("excel解析错误");
//全部rollback
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
更多参考
总结
多线程事务结合parallelStream首发!