首页 > 其他分享 >多线程事务的提交解决办法

多线程事务的提交解决办法

时间:2023-04-11 10:00:10浏览次数:43  
标签:解决办法 tasks get 插入 connection task CompletableFuture 提交 多线程

多线程处理的时候,如果发生了错误,不会因为加了@Transcational注解而生效,这里需要额外使用

SqlSessionTemplate

{
//插入主表
electronicTaxBillMapper.insertBatch(masterList);
//更新出库单状态
outOrderDetailMapper.updateByOrderCodeList(orderCodeList);
  //切割模板 可以直接使用list.subList();直接使用这个方法,也可以统一包装一个方法出来使用。
List<List<ElectronicTaxBillDetailDO>> insertSplit = CommonUtils.split(detailList,
5000);
// 插入任务列表
List<CompletableFuture<Boolean>> tasks = new ArrayList<>();
// 根据sqlSessionTemplate获取SqlSession工厂
SqlSessionFactory sqlSessionFactory = sqlSessionTemplate.getSqlSessionFactory();
  //获取会话
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获取Connection来手动控制事务
Connection connection = sqlSession.getConnection();

try {
//关闭事务自动提交
connection.setAutoCommit(false);
//获取mapper对象 定义一个映射关系
ElectronicTaxBillDetailMapper sqlSessioneleTaxBillDetailMapper = sqlSession
.getMapper(ElectronicTaxBillDetailMapper.class);
    //循环去获取数据
for (int i = 0; i < insertSplit.size(); i++) {
    List<ElectronicTaxBillDetailDO> electronicTaxBillDetailDOS = insertSplit.get(i);
    //使用的supplyAsync()方法会有返回值,如果使用runAsync()方法调用的是Runnale接口没有返回值。
CompletableFuture<Boolean> task = CompletableFuture.supplyAsync(() -> {
try {
//一个线程发生异常之后,直接抛出异常,后续不再执行插入操作
sqlSessioneleTaxBillDetailMapper.insertBatch(electronicTaxBillDetailDOS);
} catch (Exception e) {
return Boolean.FALSE;
}
return Boolean.TRUE;
}, THREAD_POOL_EXECUTOR);
tasks.add(task);
}

// 等待所有任务完成
     // join()和get()方法都是用来获取CompletableFuture异步之后的返回值 join()用来接收一些未检查的异常,get()用来接收一些检查的异常,需要抛错,或者try catch
CompletableFuture.allOf(tasks.toArray(new CompletableFuture[0])).join();
     //上面的线程处理的时候,如果插入数据库有问题,就会返回一个false,所以下面校验的时候如果有false,则回滚
// 如果有任意一个任务抛出异常,则回滚所有数据
for (CompletableFuture<Boolean> task : tasks) {
if (Boolean.FALSE.equals(task.get())) {
log.error("插入异常,事务回滚");
connection.rollback();
return CommonResult.error(INSERT_FAILED);
}
}
connection.commit();
long endTime = System.currentTimeMillis();
log.info("电子税单导入数据成功,主数据数量{},明细数据数量{}", masterList.size(),
detailList.size());
log.info("运输单导入耗时:{}毫秒" + (endTime - startTime));
} catch (Exception e) {
connection.rollback();
e.printStackTrace();
}
}

标签:解决办法,tasks,get,插入,connection,task,CompletableFuture,提交,多线程
From: https://www.cnblogs.com/ewa-03/p/17305231.html

相关文章

  • celery正常启动后能收到任务,但不执行任务的解决办法
    错误截图:celery接收到任务却不执行(多出在windows系统中)解决方法1添加–pool=solo参数celery-Acelery_tasks.mainworker--pool=solo-linfo解决方法2先安装gevent,然后在启动celery的时候添加gevent参数pipinstallgeventcelery-Acelery_tasks.mainworker-linfo......
  • Bat批处理echo输出乱码解决办法
    在批处理文件中,如果输出中文字符会出现乱码的情况,可能是因为控制台的字符编码不正确。可以在批处理文件中使用chcp命令来更改控制台的字符编码。chcp命令的语法如下:chcp[代码页]其中,代码页是指字符编码的形式,例如936代表GB2312编码,65001代表UTF-8编码等。如果要将控制台字符......
  • nacos 启动DataSource Set解决办法
    通过查看config-fatal.log日志文件发现   报错:com.mysql.cj.exceptions.CJException:PublicKeyRetrievalisnotallowed经调查资料得知,此原因跟mySql版本有关,最核心的原因是mysql8.0.13开始,使用sslMode属性代替了原来的useSSL属性,所以吧useSSL改成sslMode=DISAB......
  • c++ 多线程摘记
    有没有linux和windows通用的多线程库?ChatGPT:是的,C++11标准引入了一个名为std::thread的多线程库,它可以在Windows和Linux上使用。std::thread库提供了一种方便的方式来创建和管理线程,包括启动、等待、终止和同步线程。此外,它还提供了一些便利的功能,例如线程局部存储......
  • 介绍几种等待多线程任务执行完毕的方法
    一.引言:在我们日常的开发过程中,我们经常会开启多个线程或者创建一个线程池去执行多个并发任务,当所有任务执行完毕后,我们一般会做一个统一的处理。那我们如何知道多个线程的任务已经全部执行完毕了呢?今天由我来为大家介绍几种方法:二.join()方法在这里插入图片描述......
  • 多线程下载m3u8分段视频
    1.说明m3u8是一种传输数据的方式,比如说一集20分钟的完整视频被分割成一千多段一两秒的小视频,客户端播放的时候是感觉是连续,但如果你要下载这集视频,那就要把一千多个小视频全都下载然后自己拼接成一个完整视频。拼接的话很简单,像格式工厂等很多软件都可以轻松完成,但要一个一个下载......
  • head/reset/revert/rebase代码回滚全解:git提交记录的背后原理
    多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,操作有:回退(reset):reset是彻底回退到指定的commit版本,该commit后的所有commit都将被清除;reset执行后不会产生记录反转(revert):revert仅是撤销指定commit的修改,并不影响后续......
  • java并发编程(2):Java多线程-java.util.concurrent高级工具
    高级多线程控制类Java1.5提供了一个非常高效实用的多线程包:java.util.concurrent,提供了大量高级工具,可以帮助开发者编写高效、易维护、结构清晰的Java多线程程序。ThreadLocal类ThreadLocal类用来保存线程的独立变量。对一个线程类(继承自Thread)当使用ThreadLocal维护变......
  • java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
    复习资料:《同步与异步:并发/并行/进程/线程/多cpu/多核/超线程/管程 》基本线程类基本线程类基本线程类指的是Thread类,Runnable接口,Callable接口继承Thread创建线程继承java.lang.Thread类创建线程是最简单的一种方法,也最直接。publicclassMyThread1extendsThread{}种......
  • 在.net项目中添加Husky.Net提交验证
    参考:C#项目添加husky-jesn-博客园(cnblogs.com)官方文档:GettingStarted|Husky.Net(alirezanet.github.io)什么是Husky.net?Husky是一款githook(钩子)工具,让我们在gitcommit之前可以做一些操作,例如,代码格式化,重生生成,提交规范检查等,而Husky.net便是适用于.net平台......