jpa多线程事务
百度都百度不到jpa多线程的事务回滚,废话少说,就是干,
实现思路(可看可不看,本人也不喜欢罗里吧嗦的,想直接看干货就跳过这里,直接执行代码):
jpa本身是不支持多线程事务,所以要手动实现事务的提交和回滚,网上可参考的太复杂,而且没用的太多,自己干吧,首先,排除一般的影响事务回滚的条件(jpa事务失效的 场景),事务回滚的前提就是同一个连接,统一提交事务,
但是多线程,是多个实例,都不是同一个连接,自然不能统一回滚了,实现思路:想要实现统一的管理,就要共享同一个事务,同一个connection,我们只能手动管理主线程和子线程,所以要共享EntityManager和EntityTransaction,
需要注意的是不能直接在方法外来初始化EntityManager和EntityTransaction,会报错,通过请求,再获取对象,赋值就可以了
通过内部类,来共享这两个对象,就实现了两个测试的内部类,Thread1和Thread2,
然后通过线程池,来执行多个线程,需要注意的就是,要确定子线程都执行完毕了,再提交事务,不然的话,子线程还在执行,主线程就提交了事务,多线程事务就没法生效
代码都经过测试,直接复制粘贴,代入自己数据源测试就知道了
代码实例
/*** 注入EntityManager实例*/@Autowiredprivate EntityManagerFactory entityManagerFactory;//作为多线程的事务共享,从而统一提交或回滚,不能在这里直接createEntityManager和getTransactionEntityManager entityManager;EntityTransaction transaction;//测试方法@ResponseBody@RequestMapping(value = "/test")public RetMsgBean testThread() throws Exception {//请求的时候给实例和事务赋值entityManager = entityManagerFactory.createEntityManager();transaction = entityManager.getTransaction();try {//开始事务transaction.begin();//执行插入数据操作Query query = entityManager.createNativeQuery("insert into pt_business_logs(id) value (?)");//传入参数query.setParameter(1,"11111");//提交数据库query.executeUpdate();//创建线程池ExecutorService service= Executors.newFixedThreadPool(10);//执行事务service.execute(new Thread1());//执行事务service.execute(new Thread2());//结束线程池service.shutdown();/*** 线程没有结束,就等待500毫秒,可以随意调整等待时间,反正就是要等子线程执行完,* 不等子线程的话,子线程还在执行,主线程有可能就直接进行commit操作了,多线程事务回滚就无法生效了*/while (!service.isTerminated()) {Thread.sleep(500);System.out.println("等待子线程执行");}//事务执行完成的提示System.out.println("提交事务");//提交事务transaction.commit();} catch (Exception e) {//发生异常进行回滚,主线程的回滚不能控制子线程,只是针对主线程的异常if (transaction != null) {transaction.rollback();}e.printStackTrace();System.out.println("发生异常");}finally {entityManager.close();}//RetMsgBean无所谓,这是一个自定义的返回值类return RetMsgBean.init();}//内部类,线程1,通过继承Runnable实现
class Thread1 implements Runnable{@Overridepublic void run() {try {//执行数据库操作Query query = entityManager.createNativeQuery("insert into pt_business_logs(id) value (?)");query.setParameter(1,"222222");query.executeUpdate();//故意抛出异常System.out.println(1/0);} catch (Exception e) {e.printStackTrace();//进行回滚transaction.rollback();}}
}//内部类,线程2,通过继承Runnable实现
class Thread2 implements Runnable{@Overridepublic void run() {try {Query query = entityManager.createNativeQuery("insert into pt_business_logs(id) value (?)");query.setParameter(1,"333333");query.executeUpdate();} catch (Exception e) {e.printStackTrace();transaction.rollback();}}
}
相关文章:
jpa多线程事务
百度都百度不到jpa多线程的事务回滚,废话少说,就是干, 实现思路(可看可不看,本人也不喜欢罗里吧嗦的,想直接看干货就跳过这里,直接执行代码): jpa本身是不支持多线程事务…...
加密解密软件VMProtect教程(四):准备项目之SDK功能
VMProtect 是保护应用程序代码免遭分析和破解的可靠工具,但只有在正确构建应用程序内保护机制并且没有可能破坏整个保护的典型错误的情况下才能最有效地使用。 SDK 功能可以集成到受保护应用程序的源代码中,以设置受保护区域的边界,以检测调…...
夏令营教育小程序开发功能和优势有哪些?
随着人们生活水平的提高,对于孩子的教育问题也是越来越重视,无论是教育方式还是教育内容上都追求新颖、多样化。在暑假期间,很多家长也希望孩子能够在这个长假期之间参加一些活动,培养孩子兴趣的同时也丰富假期内容,让…...
Cocos CreatorXR 1.2.0 今日发布,正式支持 WebXR ,并开启 MR 之路
去年九月,Cocos CreatorXR v1.0.1 版本支持了 VR 内容创作,成为率先支持 XR 的国产引擎,今年三月,Cocos CreatorXR v1.1.0 版本实现了对 AR 内容开发的支持。在完成基本功能的建设后,更多开发者开始尝试使用 Cocos Cre…...
Linux 使用笔记(本人出品,必属精品)
文章目录 Part.I IntroductionChap.I 快应用Chap.II 课程所学 Part.II 基础知识Chap.X 杂记 Part.I Introduction Linux 是笔者在大四上学期学的,当时授课的刘老师现在还能偶尔见到。但是平时一般用 Windows,有机会接触 Linux 一般是偶尔在服务器上跑跑程…...
【2023 · CANN训练营第一季】初识新一代开发者套件 Atlas 200I DK A2 第二章——安装Atlas 200I DK A2跑通第一个案例
准备相关软件 包括一台PC机(空间大于10g),读卡器,32gsd卡,一根网线。 具体步骤: 开始烧录开发板镜像:将sd卡插入读卡器,将读卡器插入PC机的USB接口,根据相关链接在PC机下载制卡工具…...
concurrenthashmap
SizeCtl的用法 sizeCtl0或容量大小 (二个构造方法) sizeCtl>0(初始化或扩容后)扩容阈值 sizeCtl-1:正在初始化中 sizeCtl<-1:线程扩容中 知道为什么第一个线程扩容时2,后面的其他线程扩容…...
8年测试总结,项目/团队如何做自动化测试?效率价值?吐血整理...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…...
图像动态裁剪
1. 背景 以两级级联模型为例,第一级目标检测模型用于检测人员,第二级目标检测模型用于检测手机、对讲机等。然后实际数据采集过程中,手机、对讲机这些设备并不在人员的一级检测框内,使得二级模型训练的样本较少。 二级目标检测模…...
Thematica: 炫彩主题与黑暗奇观的Vue3之旅
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 一、介绍1.1 博客主题和目的1.2 Vue 3简介二、炫彩主题2.1 准备工作2.2 安装必要依赖2.3 创建Vue项目2.4 设置全局样式...
平凡的Python为什么能一跃成为世界排名第一的语言
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"! 作者:大周|慕课网讲师 一、前言 本文将结合个人经历为各位同学客观的分析是否有学习Python的必要、Python适合谁学、为什么…...
Wijmo 2023 v1 Crack
改进了 FlexGrid,支持 React 18 严格模式和可访问性。 5月 15, 2023 - 10:51 新版本 特征 改进了对 React 18 的支持 - 添加了对 React 18 严格模式的支持,可帮助开发人员在开发过程中查找常见错误。辅助功能改进 - 以下是此版本中…...
万物互联时代的边缘计算安全需求与挑战
随着物联网技术的快速发展,越来越多的设备和应用程序开始互联,这不仅提高了我们的生活质量,也带来了很多新的安全威胁。边缘计算作为连接数据和应用程序的关键环节,在万物互联的时代变得尤为重要。本文将讨论万物互联背景下的边缘…...
函数序列与函数项级数
文章目录 函数序列与函数项级数函数序列函数项级数Weierstrass M 判别法 函数序列与函数项级数 函数序列 点态收敛:设 f n ( x ) : [ a , b ] → R f_n(x):\,[a,\,b]\to\bold{R} fn(x):[a,b]→R 是定义在区间 [ a , b ] [a,\,b] [a,b] 上的函数序列࿱…...
UML时序图详解
上篇文章,介绍了UML状态图,并通过visio绘制一个全自动洗衣机的UML状态图实例进行讲解。 本篇,来继续介绍UML中的另一种图——时序图。 1 时序图简介 时序图(Sequence Diagram),也叫顺序图,或序列图,是一…...
Centos7.6部署postgresql15主从
目录 安装pg15(master和standby)主数据库配置(master)初始化数据库创建归档日志目录设置数据库访问权限修改数据库配置文件开启数据库 从数据库配置(standby)同步主库的数据文件创建文件standby.signal启动从数据库 主从状态验证master上验证standby上验…...
【ThinkPHP6系列学习-2】多应用模式配置
这里写一写TP6下配置多应用。因为TP6和TP5有所差异,TP6默认是单应用模式(单模块),而我们实际项目中往往是多应用的(多个模块),所以在利用TP6是就需要进行配置,开启多应用模式。 目录…...
Linux内核oops panic简析
源码基于:Linux 5.4 0. 前言 内核异常的级别大致分为三个:BUG、oops、panic。 BUG 是指那些不符合内核的正常设计,但内核能够检测出来并且对系统运行不会产生影响的问题,比如在原子上下文中休眠,在内核中用 BUG 标识。…...
Spark大数据处理讲课笔记4.8 Spark SQL典型案例
文章目录 零、本讲学习目标一、使用Spark SQL实现词频统计(一)数据源 - words.txt(二)创建Maven项目(三)添加依赖和构建插件(四)修改源目录名称(五)创建日志属…...
WhatsApp Business 多人使用终极指南
今时今日,几乎每个人的手机上都安装了 WhatsApp,不少电商更会依赖 WhatsApp作为和客户沟通的主要渠道。但对有一定规模的店铺来说,WhatsApp绑定一个号码和设备的设定实在很不方便。如何才能用WhatsApp Business批量处理客户查询呢?…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...
goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
