SpringBoot中异步执行事务REQUIRED和REQUIRED_NEW的区别

springboot中事务的使用方式

在spring的bean中,要开启数据库事务只需要在方法中标注注解

@Transactional

注解常用的参数有

  • Class[] rollbackFor() default {} 指定回滚异常
  • Propagation propagation() default Propagation.REQUIRED 事务的传播机制
  • Isolation isolation() default Isolation.DEFAULT 事务的隔离级别

事务传播机制REQUIRED和REQUIRED_NEW

REQUIRED是默认的级别,如果当前没有事务,创建新事务;如果有事务,加入当前事务

REQUIRED_NEW 如果无论当前有没有事务,开启一个新的事务

Spring异步注解@Async

启动类中加入注解@EnableAsync

@Async注解标注在方法中,使方法异步执行

测试

通过调用接口新增数据

test1方法中保存了code为-1的一条数据

test2方法中保存了code为0~9的十条数据,插入第四条数据会抛出异常报错

    @Resourceprivate TestBaseService testBaseService;@Resourceprivate ApplicationContext applicationContext;@GetMapping("/add")@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)public void test1() {TestBaseEntity preEntity = new TestBaseEntity();preEntity.setCode("-1");testBaseService.save(preEntity);TestBaseController bean = applicationContext.getBean(TestBaseController.class);for (int i = 0; i < 10; i++) {TestBaseEntity entity = new TestBaseEntity();entity.setCode(String.valueOf(i));bean.test2(entity, i);}}//@Async//@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)public void test2(TestBaseEntity entity, int i) {testBaseService.save(entity);if (i == 4) {throw new RuntimeException("异常");}}

调用接口,发现没有数据新增

image-20240420124214213

因为只设置了一个事务,有异常会导致事务回滚;有一条失败全部失败

test1设置事务提交后,再执行test2

@GetMapping("/add")
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public void testTransactional() {TestBaseEntity preEntity = new TestBaseEntity();preEntity.setCode("-1");testBaseService.save(preEntity);TestBaseController bean = applicationContext.getBean(TestBaseController.class);for (int i = 0; i < 10; i++) {TestBaseEntity entity = new TestBaseEntity();entity.setCode(String.valueOf(i));int finalI = i;TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {@Overridepublic void afterCommit() {bean.saveTest(entity, finalI);TransactionSynchronization.super.afterCommit();}});}
}

结果图

image-20240420124825069

可以看到 -1 ~ 4都新增成功了

因为手动将test1的事务提交了,而test2没有事务,所有即便报错也没有回滚,code=4正常插入

test2传播机制设置为REQUIRED_NEW

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)public void test2(TestBaseEntity entity, int i) {testBaseService.save(entity);if (i == 4) {throw new RuntimeException("异常");}}

调用接口,结果如下

image-20240420125129811

test1的事务不会因为test2的报错而受到影响,执行的10次test2每次都是一个新的事务

当code=4时,发生异常,当前事务回滚,程序返回,所以code=4的数据回滚了,后面的5-9根本没有执行新增插入

test2传播机制设置为REQUIRED_NEW,开启@Async注解

@Async
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)public void test2(TestBaseEntity entity, int i) {testBaseService.save(entity);if (i == 4) {throw new RuntimeException("异常");}}

调用接口,结果如下

image-20240420130310639

可以看到除了code=4其他的都新增成功了

因为在每个test2方法新开启了事务,而且方法是异步的,报错异常对本方法以外没有任何影响

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

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

相关文章

Hive:GROUP BY GROUPING SETS

分组聚合 group by x1, x2, x3 grouping sets((x1), (x1, x2), (x1, x3),(x1, x2, x3)) 将不同维度的GROUP BY结果进行UNION ALL操作 GROUPING SETS会把在单个GROUP BY逻辑中没有参与GROUP BY的那一列置为NULL值&#xff0c;这样聚合出来的结果&#xff0c;未被GROUP BY的列…

web server apache tomcat11-10-Class Loader

前言 整理这个官方翻译的系列&#xff0c;原因是网上大部分的 tomcat 版本比较旧&#xff0c;此版本为 v11 最新的版本。 开源项目 从零手写实现 tomcat minicat 别称【嗅虎】心有猛虎&#xff0c;轻嗅蔷薇。 系列文章 web server apache tomcat11-01-官方文档入门介绍 web…

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.04.10-2024.04.15

文章目录~ 1.Photo-Realistic Image Restoration in the Wild with Controlled Vision-Language Models2.Do LLMs Understand Visual Anomalies? Uncovering LLM Capabilities in Zero-shot Anomaly Detection3.UNIAA: A Unified Multi-modal Image Aesthetic Assessment Base…

大华相机C#学习之Enumerator类

构造函数 Enumerator() 创建一个Enumerator实例。 常用方法 EnumerateDevices() 枚举所有发现设备,返回List<IDeviceInfo>对象。 List<IDeviceInfo> devices new List<IDeviceInfo>();private void test_Click(object sender, EventArgs e) {devicesEnum…

【Spring进阶】基于注解的面向切面编程(AOP)详解

hi&#xff0c;我是程序员王也&#xff0c;一个资深Java开发工程师&#xff0c;平时十分热衷于技术副业变现和各种搞钱项目的程序员~&#xff0c;如果你也是&#xff0c;可以一起交流交流。 今天我们聊一聊Spring中的AOP~ AOP的核心概念 面向切面编程&#xff08;AOP&#xff…

如何实现redis的高可用?

1.主从模式&#xff1a;就是一个住节点&#xff0c;多个从节点&#xff0c;但是弊端是一个主节点崩了&#xff0c;需要手动的切换从节点&#xff0c;这个挺麻烦的 2.哨兵模式&#xff1a;就是为了解决主从模式的弊端从而在主从模式的基础上加了哨兵&#xff0c;从而可以实现自动…

【一】ECharts----【基本概念、基本实例】

目录 零.前言 一.ECharts的安装 1.1独立版本的安装 1.2CDN的安装 1.3NPM的安装 二.ECharts实例 三.系列(series) 四.创建一个ECharts图表的基本步骤 4.1创建一个DOM容器 4.2使用DOM节点初始化ECharts对象 4.3设置配置信息 4.3.1图表标题 4.3.2提示信息 4.3.3图例组…

90天玩转Python—18—Python面向对象编程:核心概念详解

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

提取点云-------PCL

提取点云 /// <summary> /// VoxelGrid滤波下采样 /// </summary> /// <param name"cloud">需要滤波的点云</param> /// <param name"lx">三维体素栅格的x</param> /// <param name"ly">三维体素栅格…

全新Linux教程-驱动大全-PCI和PCIe子系统-P2-PCI设备的访问方法-非桥设备

主要讲PCI设备的硬件访问方法。 1、PCI的硬件结构 CPU发出的地址是CPU地址&#xff0c;可能是访问底下任何一个设备。地址范围不一样&#xff0c;访问到的外设就不一样。在嵌入式中&#xff0c;通常将4G内存地址空间分成好几个区域&#xff0c;不同的访问分给不同的地址。桥内…

Github首页美化(updating)

Github首页美化 一、新建仓库二、美化Github首页主页访问量统计仓库状态统计常用语言占比统计社交链接 界面展示 一、新建仓库 对Github首页进行美化&#xff0c;需要新建一个仓库名和自己 Github 用户名相同的仓库&#xff1b;并且需要添加一个 README.md自述文件即可。 如果…

nVisual在线网络规划设计软件

●01● nVisual在线网络规划设计软件 在信息化快速发展的今天&#xff0c;网络基础设施的建设与优化变得尤为关键。为了满足现代通信行业对高效、精准的网络规划需求&#xff0c;nVisual在线网络规划设计软件应运而生&#xff0c;它通过集成先进的GIS技术和网络规划工具&#…

Ansible相关

Ansible 环境准备 主机名ip分组crontol192.168.88.1node1192.168.88.11testnode2192.168.88.12proxynode3192.168.88.13webserversnode4192.168.88.14webserversnode5192.168.88.15database 所有操作只需在crontol上操作即可 安装ansible # 依赖一般也会跟着一起装好 yum …

sprinboot+vue集成neo4j图数据库

一 、java后台 1.1 package com.admin.domain;/*** 功能描述&#xff1a;** author wangwei* date 2024-01-15 22:13*/ public class ConnectWeb {private String connectWebId;private String connectWebName;private String connectWebInfo;private String personWebIdAlph…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

华为校招机试 - 会议通知转发总人数(20240410)

题目描述 在一个办公区内,有一些正在办公的员工,当员工 A 收到会议通知: 他会将这个会议通知转发给周围四邻(上下左右工位的同事)团队内的同事,周围收到该邮件的同事会继续转发给周围四邻(上下左右工位的同事)团队内的同事,直到周围没有再需要往下传播的同事则会停止…

构建Python中的分布式日志系统:ELK与Fluentd的结合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代软件开发中&#xff0c;日志系统是至关重要的组成部分。它们不仅用于故障排查和性能监…

利用Python进行大规模数据处理

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 利用Python进行大规模数据处理&#xff1a;Hadoop与Spark的对比 随着数据量的不断增长&…

ZJGSU 1850 不同出栈情况

描述 假设有n个元素依次进栈&#xff0c;给出他们可能的不同的出栈情况。 输入 3 1 2 3 输出 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 输入样例 1 3 1 2 3 输出样例 1 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 #include <stdio.h>int tot, res, sta, n; int r[2005], s[2005…

centos linux 7.9安装php8.2.18不支持mysqli模块,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…