当前位置: 首页 > news >正文

多线程事务回滚

最近开发,有地方需要用到多线程,每个线程里面处理多个方法,过程中遇到了一个问题,我们使用平时的@Transactional注解,就是当前一个方法执行完成(比如插入操作),后一个方法是不会事务回滚的。当时觉得很不可思议,后来经过半天时间,终于挖出原因,并成功解决。
我这里先说明原因:多线程底层连接数据库的时候,时使用的线程变量(TheadLocal),所以,开多少线程理论上就会建立多少个连接,每个线程有自己的连接,事务肯定不是同一个了。
解决办法:我强制手动把每个线程的事务状态放到一个同步集合里面。然后如果有单个异常,循环回滚每个线程。
代码如下:

 //先在开启多线程外面,定义一个同步集合:
 List<TransactionStatus> transactionStatuses = Collections.synchronizedList(new ArrayList<TransactionStatus>());
 //开启多线程
 executorService.execute(new Runnable() {
          @Override
          public void run() {
          DefaultTransactionDefinition def = new DefaultTransactionDefinition();
              def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); // 事物隔离级别,开启新事务,这样会比较安全些。
              TransactionStatus status = transactionManager.getTransaction(def); // 获得事务状态
              transactionStatuses.add(status);
              try{
                  //逻辑1
                  ...
                  //逻辑2
                  ...
              
              }catch(Exception e){
              
              }
          
          }

相关文章:

  • 5.30 Tree Traversal + Tree manipulation
  • 网页视频加速播放
  • 阿里云新一代关系型数据库 PolarDB 剖析
  • 函数模板(四十七)
  • Springboot 整合 dubbo 的一些坑
  • 10 个 Python 初学者必知编码小技巧
  • CentOS7下安装NVIDIA独立显卡驱动出现X service error问题解决方法
  • python爬虫练习--爬取猫眼热映口碑榜
  • Python字符串capitalize center 方法
  • 实验四 shell编程2
  • 接口只用于定义类型(19)
  • 洛谷 P2421 [NOI2002]荒岛野人
  • python第五天学习总结
  • Nginx配置详解
  • ngnix-内网能用,外网不能用
  • @jsonView过滤属性
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • PV统计优化设计
  • SwizzleMethod 黑魔法
  • 欢迎参加第二届中国游戏开发者大会
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 数据结构java版之冒泡排序及优化
  • 微信支付JSAPI,实测!终极方案
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • linux 淘宝开源监控工具tsar
  • 通过调用文摘列表API获取文摘
  • ​io --- 处理流的核心工具​
  • ​如何防止网络攻击?
  • #include
  • (09)Hive——CTE 公共表达式
  • (k8s中)docker netty OOM问题记录
  • (第27天)Oracle 数据泵转换分区表
  • (独孤九剑)--文件系统
  • (二)linux使用docker容器运行mysql
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)计算机毕业设计ssm电影分享网站
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)为什么要选择C++
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • ***原理与防范
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Remoting学习笔记(三)信道
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 设计模式初探
  • .net6+aspose.words导出word并转pdf
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ACM] hdu 1201 18岁生日
  • [android] 天气app布局练习
  • [bzoj 3534][Sdoi2014] 重建
  • [C#]C# OpenVINO部署yolov8图像分类模型
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [hdu 4552] 怪盗基德的挑战书
  • [INSTALL_FAILED_TEST_ONLY],Android开发出现应用未安装