Java多线程下使用TransactionTemplate控制事务

简介

本文展示了在Java的多线程环境下使用Spring的TransactionTemplate控制事务的提交与回滚,当任何一个子线程出现异常时,所有子线程都将回滚

环境

JDK:1.8.0_211

SpringBoot:2.5.10

说明 

本文通过同时写入用户(User)和用户详细信息(UserDetail)的Demo方式来展开介绍,所有的实体类和服务层就忽略不写了,只写一个控制器当中的实现,整体代码比较简洁明了

先注入需要的依赖 

    //用户普通信息@Autowired private IUserService userService;//用户详细信息    @Autowired private IUserDetailService userDetailService;//建立一个线程池private ExecutorService executor = Executors.newFixedThreadPool(10);//注入手动事务控制模板    @Autowired private TransactionTemplate transactionTemplate;

一、成功 

下面是整个手动控制事务的多线程方法,会写入成功

    @RequestMapping("/")public String saveUser(){int len = 10;final CountDownLatch latch = new CountDownLatch(len);AtomicBoolean b = new AtomicBoolean(false);for (int i = 0; i < len; i++) {final int j = i;executor.submit(()->{transactionTemplate.execute(transactionStatus ->{try {User user = new User();user.setUserName("A"+j);user.setPhone("15851885878");userService.save(user);UserDetail userDetail = new UserDetail();userDetail.setUserId(user.getId());int sex = j % 2 == 0 ? 1 : 0;userDetail.setSex(sex);userDetail.setAddress("江苏省南京市江宁区秣陵街道");userDetailService.save(userDetail);} catch (Exception e) {log.info("保存用户信息发送异常!");b.set(Boolean.TRUE);} finally {latch.countDown();}try {latch.await();if(b.get()){log.info("========开始回滚========");transactionStatus.setRollbackOnly();log.info("========回滚完成========");}} catch (InterruptedException e) {log.info("线程中断异常!");}return true;});});}return "OK";}

核心对象:AtomicBoolean、ExecutorService、TransactionTemplate。transactionTemplate.execute()方法接受一个事务的状态对象(TransactionStatus),当发生异常时,执行setRollbackOnly()即可回滚 

代码逻辑:每次循环一次,线程计数器-1( latch.countDown() ),但是await()方法会使当前线程进入阻塞状态直至线程计数器=0 时才被唤醒(这也是为什么 “ latch.countDown() ” 要放在finally中的原因,如果线程计数器没有顺利 -1,线程最终无法被唤醒程序将卡死)。这时中间某个子线程发生了异常,由于所有的线程都是处于阻塞状态并没有执行提交,因此当线程被唤醒时发现AtomicBoolean这个对象的引用等于“ true ”了,所以都开始执行回滚操作。

内部解析:AtomicBoolean这个对象是线程安全的,其内部定义了一个被 “ volatile ” 修饰的变量“ value ”。学过并发编程的大概都知道线程对共享变量的工作方式是优先取三级缓存中的工作变量复制一份到自己的工作内存中使用,当某个线程因业务需要或发生异常时对于自身工作内存中的共享变量的修改(就是本文中的 "b"变量 )并同步回主存时,对于其他线程是不可知的(可见性(Visibility)问题),而关键字 “ volatile ”会强制清空其他线程中该变量的值,这样每个线程就都会获取到被修改后的最新的值,所以每个线程被唤醒时都发现变量b=true了,因此都回滚了

(volatile可以保证:可见性,有序性(禁止重排序) )

写入成功的截图

二、失败 

已知上图是写入成功了,下面看看失败的时候会不会回滚,在方法中加入以下代码

if(j == 8){//执行第九次时异常int div = 10/0;
}

现在把表中的数据清空

truncate 数据表名

 注意:我建表时使用了ID自增(auto_increment),使用 “ truncate ” 可以连同auto_increment的标记一起清空,让auto_increment可以从1开始

代码执行后报异常,并且回滚了

 数据也没有新增进去

成功 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146829.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

zookeperkafka学习

1、why kafka 优点 缺点kafka 吞吐量高&#xff0c;对批处理和异步处理做了大量的设计&#xff0c;因此Kafka可以得到非常高的性能。延迟也会高&#xff0c;不适合电商场景。RabbitMQ 如果有大量消息堆积在队列中&#xff0c;性能会急剧下降每秒处理几万到几十万的消息。如果…

记录一些涉及到界的题

文章目录 coppersmith的一些相关知识题1 [N1CTF 2023] e2Wrmup题2 [ACTF 2023] midRSA题3 [qsnctf 2023]浅记一下 coppersmith的一些相关知识 上界 X c e i l ( 1 2 ∗ N β 2 d − ϵ ) X ceil(\frac{1}{2} * N^{\frac{\beta^2}{d} - \epsilon}) Xceil(21​∗Ndβ2​−ϵ) …

【Proteus仿真】【STM32单片机】防火防盗GSM智能家居设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用声光报警模块、LCD1602显示模块、DS18B20温度、烟雾传感器模块、按键模块、PCF8591 ADC模块、红外检测模块等。 主要功能&#xff1a; 系统运行…

Mac电脑好用的窗口管理软件 Magnet 中文for mac

Magnet是一款用于Mac操作系统的窗口管理工具&#xff0c;它可以帮助您快速和方便地组织和管理应用程序窗口&#xff0c;以提高您的工作效率和多任务处理能力。 以下是Magnet的一些主要功能和特点&#xff1a; 窗口自动调整&#xff1a;Magnet允许您通过简单的拖放操作或使用快…

微信小程序 限制字数文本域框组件封装

微信小程序 限制字数文本域框 介绍&#xff1a;展示类组件 导入 在app.json或index.json中引入组件 "usingComponents": {"text-field":"/pages/components/text-field/index"}代码使用 <text-field maxlength"500" bindtabsIt…

IDEA创建文件添加作者及时间信息

前言 当使用IDEA进行软件开发时&#xff0c;经常需要在代码文件中添加作者和时间信息&#xff0c;以便更好地维护和管理代码。 但是如果每次都手动编辑 以及修改那就有点浪费时间了。 实践 其实我们可以将注释日期 作者 配置到 模板中 同时配置上动态获取内容 例如时间 这样…

PaddleClas学习2——使用PPLCNet模型对车辆朝向进行识别(python)

使用PPLCNet模型对车辆朝向进行识别 1. 配置PaddlePaddle,PaddleClas环境2. 准备数据2.1 标注数据格式2.2 标注数据3. 模型训练3.1 修改配置文件3.2 训练、评估4 模型预测1. 配置PaddlePaddle,PaddleClas环境 安装:请先参考文档 环境准备 配置 PaddleClas 运行环境。 2. 准…

美国服务器:全面剖析其主要优点与潜在缺点

​  服务器是网站搭建的灵魂。信息化的今天&#xff0c;我们仍需要它来为网站和应用程序提供稳定的运行环境。而美国作为全球信息技术靠前的国家之一&#xff0c;其服务器市场备受关注。那么&#xff0c;美国服务器究竟有哪些主要优点和潜在缺点呢? 优点 数据中心基础设施&a…

Vue 路由缓存 防止路由切换数据丢失

在切换路由的时候&#xff0c;如果写好了一丢数据在去切换路由在回到写好的数据的路由去将会丢失&#xff0c;这时可以使用路由缓存技术进行保存&#xff0c;这样两个界面来回换数据也不会丢失 在 < router-view >展示的内容都不会被销毁&#xff0c;路由来回切换数据也…

Linux上编译和安装SOFA23.06

前言 你可以直接使用编译安装好的SOFA版本Installing from all-included binaries (v23.06.00)&#xff1a; 如果你想自己编译&#xff0c;可以看我下面写的内容&#xff0c;不过绝大多数是从官网来的&#xff0c;如果和官网有出入&#xff0c;建议还是以官网为准。 在Linux下…

PVE Win平台虚拟机下如何安装恢复自定义备份Win系统镜像ISO文件(已成功实现)

环境: Virtual Environment 7.3-3 Win s2019 UltraISO9.7 USM6.0 NTLite_v2.1.1.7917 问题描述: PVE Win平台虚拟机下如何安装恢复自定义备份Win系统镜像ISO文件 本次目标 主要是对虚拟机里面Win系统备份做成可安装ISO文件恢复至别的虚拟机或者实体机上 解决方案: …

【数据库】数据库连接池导致系统吞吐量上不去-复盘

在实际的开发中&#xff0c;我们会使用数据库连接池&#xff0c;但是如果不能很好的理解其中的含义&#xff0c;那么就可以出现生产事故。 HikariPool-1 - Connection is not available, request timed out after 30001ms.当系统的调用量上去&#xff0c;就出现大量这样的连接…

NET8 ORM 使用AOT SqlSugar

.NET AOT8 基本上能够免强使用了, SqlSugar ORM也支持了CRUD 能在AOT下运行了 Nuget安装 SqlSugarCore 具体代码 StaticConfig.EnableAot true;//启用AOT 程序启动执行一次就好了//用SqlSugarClient每次都new,不要用单例模式 var db new SqlSugarClient(new ConnectionC…

Os-ByteSec

Os-ByteSec 一、主机发现和端口扫描 主机发现&#xff0c;靶机地址192.168.80.144 端口扫描&#xff0c;开放了80、139、445、2525端口 二、信息收集 访问80端口 路径扫描 dirsearch -u "http://192.168.80.144/" -e *访问扫描出来的路径&#xff0c;没有发现…

Idea安装完成配置

目录&#xff1a; 环境配置Java配置Maven配置Git配置 基础设置编码级设置File Header自动生成序列化编号配置 插件安装MyBtisPlusRestfulTooklkit-fix 环境配置 Java配置 Idea右上方&#xff0c;找到Project Settings. 有些版本直接有&#xff0c;有些是在设置下的二级菜单下…

LLM实现RPA

“PROAGENT: 从机器人流程自动化到代理流程自动化”这篇论文有几个创新点是比较有意思的&#xff1a;1.通过描述方式生成执行链&#xff0c;执行链通过代码方式生成保证执行链的稳健、可约束2.对执行过程抽取出数据结构&#xff0c;数据结构也通过代码生成方式来约束3.整个过程…

Web之CSS笔记

Web之HTML、CSS、JS 二、CSS&#xff08;Cascading Style Sheets层叠样式表&#xff09;CSS与HTML的结合方式CSS选择器CSS基本属性CSS伪类DIVCSS轮廓CSS边框盒子模型CSS定位 Web之HTML笔记 二、CSS&#xff08;Cascading Style Sheets层叠样式表&#xff09; Css是种格式化网…

【论文阅读】基于隐蔽带宽的汽车控制网络鲁棒认证(一)

文章目录 Abstract第一章 引言1.1 问题陈述1.2 研究假设1.3 贡献1.4 大纲 第二章 背景和相关工作2.1 CAN安全威胁2.1.1 CAN协议设计2.1.2 CAN网络攻击2.1.3 CAN应用攻击 2.2 可信执行2.2.1 软件认证2.2.2 消息身份认证2.2.3 可信执行环境2.2.4 Sancus2.2.5 VulCAN 2.3 侧信道攻…

竞赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

Windows 11 设置 wsl-ubuntu 使用桥接网络

Windows 11 设置 wsl-ubuntu 使用桥接网络 0. 背景1. Windows 11 下启用 Hyper-V2. 使用 Hyper-V 虚拟交换机管理器创建虚拟网络3. 创建 .wslconfig 文件4. 配置 wsl.conf 文件5. 配置 wsl-network.conf 文件和 resolv.conf6. 创建 00-wsl2.yaml7. 安装 net-tools 和 openssh-s…