Spring事务及传播机制
概念
在MySQL中介绍过,当同一时间出现一起读写数据的情况,可能会导致最终的结果出错,因此可以使用事务来提高隔离级别
而Spring中也可以实现事务
手动添加事务
使用SpringBoot中的DataSourceTransactionManager对象可以获取事务,提交事务,回滚事务
TransactionDefinition是事务的属性,在获取事务时需要传入这个参数
而TransactionStatus则是在获取事务时获取的对象,最终回滚时使用
@RestController
@RequestMapping("url")
public class 实现类 {@Autowiredprivate DataSourceTransactionManager transactionManager;@Autowiredprivate TransactionDefinition transactionDefinition;@RequestMapping("url")public 相关方法() {//开启事务TransactionStatus transactionStatus =transactionManager.getTransaction(transactionDefinition);//处理事务//回滚事务transactionManager.rollback(transactionStatus);}
例如:
@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate DataSourceTransactionManager transactionManager;@Autowiredprivate TransactionDefinition transactionDefinition;@RequestMapping("/add")public int add(UserInfo userInfo) {if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}//开启事务TransactionStatus transactionStatus =transactionManager.getTransaction(transactionDefinition);int result = userService.add(userInfo);//回滚事务transactionManager.rollback(transactionStatus);return result;}
}
在页面中,传输了参数username = 1, password = 1
但是在数据库中,并没有出现这行数据
自动添加事务
使用@Transactional注解可以快速添加事务
@Transactional
@RequestMapping("/insert")
public Integer insert(UserInfo userInfo) {if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result = userService.add(userInfo);}return result;
}
如果没有异常,那么会自动提交事务,如果有异常,事务会进行回滚
例如:在类中添加空指针异常
如果没有添加@Transactional那么在异常出现前数据已经上传到数据库
@RequestMapping("/insert")
public Integer insert(UserInfo userInfo) {if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result = userService.add(userInfo);int num = 1 / 0;return result;
}
而加了@Transactional注解,就可以自动回滚事务,数据库中就没有这行数据了
而如果我们添加了try,catch语句,spring就不会感知到异常的存在了,也就不会进行事务的回滚了
@Transactional //声明式事务(没有错误自动提交)
@RequestMapping("/insert")
public Integer insert(UserInfo userInfo) {if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result = userService.add(userInfo);try{int num = 1 / 0;} catch (Exception e){e.printStackTrace()}return result;
}
如果我们还想要事务进行自动回滚,那么可以使用throw将异常抛出,这样spring就能再次感知到异常的存在了
@Transactional //声明式事务(没有错误自动提交)
@RequestMapping("/insert")
public Integer insert(UserInfo userInfo) {if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result = userService.add(userInfo);try{int num = 10 / 0;} catch (Exception e){e.printStackTrace();throw e;}return result;
}
如果不想要页面出现报错信息,那么可以不添加throw语句,而是手动回滚事务
@Transactional //声明式事务(没有错误自动提交)
@RequestMapping("/insert")
public Integer insert(UserInfo userInfo) {if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername()) ||!StringUtils.hasLength(userInfo.getPassword())) {return 0;}int result = userService.add(userInfo);try{int num = 10 / 0;} catch (Exception e){e.printStackTrace();TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()}return result;
}
事务隔离级别设置
当不同事务同时对数据库进行数据操作,就会出现问题,因此可以针对不同的情景设置不同的隔离级别
在@Transactional注解中可以设置事务的隔离级别
代码 | 含义 | 问题 |
---|---|---|
Isolation.DEFAULT | 默认级别 以数据库隔离级别执行 | |
Isolation.READ_UNCOMMITTED | 读未提交 可以读未提交数据 | 存在脏读问题 |
Isolation.READ_COMMITED | 读已提交 只能读到已经提交事务 | 存在不可重复读问题 |
Isolation.REPEATABLE_READ | 可重复读 | 存在幻读问题 |
Isolation.SERIALIZABLE | 串行化 | 性能低 |
事务传播机制
在项目中会存在多个方法链式调用,而每一个方法都有可能存在事务,因此存在不同的事物传播机制
分别有如下几种事物传播级别:
代码 | 说明 |
---|---|
Propagation.REQUIRED | (默认)如果当前存在事务则加入事务,都则创建一个事务 |
Propagation.SUPPORTS | 如果当前存在事务就加入事务,否则就以非事务方式运行 |
Propagation.MANDATORY | 如果当前存在事务就加入事务,否则抛出异常 |
Propagation.REQUIRES_NEW | 不管当前有没有事务,都创建并使用新事务 |
Propagation.NOT_SUPPORTED | 不管当前有没有事务,都以非事务方式运行 |
Propagation.NEVER | 以非事务形式运行,如果当前存在事务就抛出异常 |
Propagation.NESTED | 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务运行,当作REQUIRED |
相关文章:

Spring事务及传播机制
概念 在MySQL中介绍过,当同一时间出现一起读写数据的情况,可能会导致最终的结果出错,因此可以使用事务来提高隔离级别 而Spring中也可以实现事务 手动添加事务 使用SpringBoot中的DataSourceTransactionManager对象可以获取事务࿰…...

43-Golang中的goroutine!!!
Golang中的goroutine进程和线程说明并发和并行并发并行Go协程和Go主线程案例小结goroutine的调度机制MPG模式基本介绍MPG模式运行的状态1MPG模式运行的状态2设置GOlang运行的CPU数不同 goroutine之间如何通讯使用全局变量加锁同步改进程序进程和线程说明 1.进程就是程序在操作…...

[深入理解SSD系列 闪存实战2.1.5] NAND FLASH基本读操作及原理_NAND FLASH Read Operation源码实现
前言 上面是我使用的NAND FLASH的硬件原理图,面对这些引脚,很难明白他们是什么含义, 下面先来个热身: 问1. 原理图上NAND FLASH只有数据线,怎么传输地址? 答1.在DATA0~DATA7上既传输数据,又传输地址 当ALE为高电平时传输的是地址, 问2. 从NAND FLASH芯片手册可知,要…...

pandas库中的read_csv函数读取数据时候的路径问题详解(ValueError: embedded null character)
read_csv()函数不仅是R语言中的一个读取csv文件的函数,也是pandas库中的一个函数。pandas是一个用于数据分析和处理的python库。它的read_csv函数可以读取csv文件里的数据,并将其转化为pandas里面的DataFrame对象。它由很多参数可以设置,例如…...

【量化交易笔记】4.移动平均值的实现
上一讲已经讲A股的数据下载到本地或保存数据库,我们可以随时使用。 移动平均MA(Moving Average) ,是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成…...

2023年3月份的野兔在线工具系统版本更新
这个是野兔在线工具系统中文版更新,这次更新的功能,和修改的问题还是比较多的,也修复系统部分功能,应该也是目前市面上在线工具比较多的一个系统了。系统名称:野兔在线工具系统系统语言:中文版系统源码&…...

科技成果赋智中小企业深度行 边界无限靖云甲ADR入选十大优秀案例
近日,国家工业信息安全发展研究中心、青岛市工业和信息化局、青岛市民营经济发展局、青岛市即墨区人民政府、青岛蓝谷管理局联合举办的科技成果赋智中小企业“深度行”活动(青岛站)成功举办,同步举行了赋智“深度行”活动…...

我们的理性何处安放
每天工作压力和各种人相处都让我们非常忙碌,我们上大学,努力工作,都是想获得更好的人生场景,素养,提升自身的认知,这样就是对我们大多数人生最负责任。如何让自己理性与人为善,并能被人温柔以待…...
RecyclerView的详细使用
首先就是了解ListView和RecyclerView的区别1.ListView相比RecycleView的优点a.ListView实现添加HeaderView和FooderView有直接的方法b.分割线可以直接设置c.ListView实现onItemClickListence和onItemLongClickListence有直接的方法2.RecyclerView相比ListView的优点a.封装了Vie…...
一、向量及其线性运算
🙌作者简介:数学与计算机科学学院出身、在职高校高等数学专任教师,分享学习经验、生活、 努力成为像代码一样有逻辑的人! 🌙个人主页:阿芒的主页 ⭐ 高等数学专栏介绍:本专栏系统地梳理高等数学…...

Spring Cloud/Spring Cloud Alibaba核心知识总结
Spring Cloud核心知识总结 springCloud是一个服务治理平台,若干个框架的集合,提供了全套的分布式系统的解决方案。包含:服务注册与发现、配置中心、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息、分布式事务等等。 SpringC…...

Locust框架从0到1入门
Locust介绍 Locust是使用Python语言编写实现的开源性能测试工具,可以用来测试Web应用程序、API、数据库等各种应用程序的性能,使用起来简洁、轻量、高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力。中文意为&a…...
C++:整数(short ,int,long,long long)表示范围
整形 C用short、int、long 、long long来表示整数的整形,同一整形也分为有符号(signed)和无符号(unsigned)两种。数据长度与操作系统和编译器的位数有关,其能够表示的范围也有所不同。接下来本文将用代码的…...

会声会影2023旗舰版新功能介绍,Corel VideoStudio Ultimate2023以及电脑系统配置要求
会声会影2023中文旗舰版功能非常强大的视频编辑软件,非常专业的使用效果,会声会影2023中文版可以针对剪辑电影进行使用,非常强大的色彩校正方式,无论什么光线下进行拍摄,都可以通过后期进行调整,并且里面超…...

软件测试用例篇(5)
测试是否运行代码去划分? 1)静态测试: 不运行代码,检查代码的风格,格式是否符合公司的标准规范,检查代码的逻辑结构是否满足需求要实现的功能 看代码,不运行代码,通过静态分析代码的语法,编写规…...
三个修饰符
三个修饰符三个修饰符一、abstract1.1 修饰类1.2 修饰方法二、final2.1 修饰类2.2 修饰方法2.3 修饰变量2.3.1 修饰属性2.3.2 修饰局部变量2.3.3 修饰方法的参数2.3.4 常量三、static关键字3.1 修饰属性3.2 修饰方法3.3 修饰代码块3.4 继承时的执行顺序三个修饰符 一、abstrac…...

JVM调优面试题——参数命令专题
文章目录1、JVM参数有哪些?1.1、 标准参数1.2、-X参数1.3、 -XX参数1.4、 其他参数1.5、 查看参数1.6、 设置参数的常见方式1.7、 常用参数含义2、JVM常用命令有哪些?2.1、jps2.2、jinfo2.3、jstat2.4、jstack2.5、jmap3、你会估算GC频率吗?4、 内存溢出…...

单例模式(设计模式详解)
单例模式 描述 单例模式是一种创建型模式,它的目的是确保一个类只有一个实例,并提供全局访问点。这个实例可以被多个客户端共享,从而避免创建多个实例所带来的资源浪费和不必要的复杂性。 实现 懒汉模式 public class LasySingleton {priv…...
设计一份关于文化遗产视频的调查问卷
参考文献:[1]任洁. 重庆美食类短视频传播策略研究[D].重庆交通大学,2021.DOI:10.27671/d.cnki.gcjtc.2021.000699.📰1 设计背景现已制作一些关于文化遗产的时长4-5分钟的视频,需要面向在校大学生收集他们对视频的看法从而分析视频的传播效果&…...

Linux内核移植
内核移植半导体厂商会从linux内核官网下载某个版本,将其移植到自己的CPU上,测试成功后就会将其开放给该半导体的厂商的CPU开发者,开发者下载其提供的linux内核,然后将其移植到自己的 产品上。1、NXP官方开发板Linux内核编译测试编…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...