Spring事务和事务传播机制
博主主页: 码农派大星.
数据结构专栏:Java数据结构
数据库专栏:数据库
JavaEE专栏:JavaEE
软件测试专栏:软件测试
关注博主带你了解更多知识
目录
1.事务
1.1 什么是事务?
1.2 为什么需要事务?
1.3 事务的操作
2. Spring 中的事务
1. 编程式事务
2. 声明式事务@Transactional
1. 添加依赖
2. 在需要事务的⽅法上添加 @Transactional 注解就可以实现
@Transactional 作⽤
@Transactional 详解
rollbackFor
编辑
3. Spring事务隔离级别
4. Spring 事务传播机制
4.1 什么是事务传播机制
4.2 事务的传播机制种类
总结
1.事务
1.1 什么是事务?
事务会把所有的操作作为⼀个整体,⼀起向数据库提交或者是撤销操作请求.所以这组操作要么同时成 功,要么同时失败
1.2 为什么需要事务?
程序开发时,也会有事务的需求
⽐如转账操作:
第⼀步:A账⼾-100元.
第⼆步:B账⼾+100元
如果没有事务,第⼀步执⾏成功了,第⼆步执⾏失败了,那么A账⼾的100元就平⽩⽆故消失了.如果使 ⽤事务就可以解决这个问题,让这⼀组操作要么⼀起成功,要么⼀起失败
1.3 事务的操作
事务的操作主要有三步:
1. 开启事starttransaction/begin(⼀组操作前开启事务)
2. 提交事务:commit(这组操作全部成功,提交事务)
3. 回滚事务:rollback(这组操作中间任何⼀个操作出现异常,回滚事务)
-- 开启事务start transaction;-- 提交事务commit;-- 回滚事务rollback;
2. Spring 中的事务
Spring 中的事务操作分为两类:
1. 编程式事务(⼿动写代码操作事务).
2. 声明式事务(利⽤注解⾃动开启和提交事务)
我们先做准备工作
创建实体类:
创建mapper类:
创建controller类
创建service服务类
1. 编程式事务
Spring ⼿动操作事务和上⾯MySQL操作事务类似
开启事务(获取事务),提交事务,回滚事务
SpringBoot 内置了两个对象:
DataSourceTransactionManager事务管理器,⽤来获取事务(开启事务),提交或回滚事务
TransactionDefinition 是事务的属性,在获取事务的时候需要将TransactionDefinition 传递进去从⽽获得⼀个事务TransactionStatus
@Slf4j
@RequestMapping("/user")
@RestController
public class UserController {@Autowiredprivate DataSourceTransactionManager transactionManager;//定义事务属性@Autowiredprivate TransactionDefinition transactionDefinition;@Autowiredprivate UserService userService;@RequestMapping("/registry")public Boolean registry(String name, String password){//开启事务TransactionStatus transaction = transactionManager.getTransaction(transactionDefinition);Integer result = userService.insertUser(name,password);log.info("数据影响行数:"+result);//回滚事务transactionManager.rollback(transaction);//提交事务transactionManager.commit(transaction);return true;}}
测试开始事务,提交事务成功:
2. 声明式事务@Transactional
1. 添加依赖
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId></dependency>
2. 在需要事务的⽅法上添加 @Transactional 注解就可以实现
⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了没有处理的异常会⾃动回滚事务
@Transactional 作⽤
@Transactional 可以⽤来修饰⽅法或类
修饰⽅法时:只有修饰public⽅法时才⽣效
修饰类时:对@Transactional修饰的类中所有的public⽅法都⽣效
⽅法/类被 @Transactional 注解修饰时,在⽬标⽅法执⾏开始之前,会⾃动开启事务,⽅法执⾏结束之后,⾃动提交事务
如果在⽅法执⾏过程中,出现异常,且异常未被捕获,就进⾏事务回滚操作. 如果异常被程序捕获,⽅法就被认为是成功执⾏,依然会提交事务
@Transactional 详解
@Transactional 注解当中的三个常⻅属性:
1. rollbackFor: 异常回滚属性.指定能够触发事务回滚的异常类型.可以指定多个异常类型
2. Isolation: 事务的隔离级别,默认值为Isolation.DEFAULT
3.propagation: 事务的传播机制.默认值为 Propagation.REQUIRED
rollbackFor
@Transactional 默认只在遇到运⾏时异常和Error时才会回滚,⾮运⾏时异常不回滚.即 Exception的⼦类中,除了RuntimeException及其⼦类
如果我们需要所有异常都回滚,需要来配置@Transactional 注解当中的 rollbackFor 这个属性指定出现何种异常类型时事务进⾏回滚((rollbackFor = Exception.class)
3. Spring事务隔离级别
4. Spring 事务传播机制
4.1 什么是事务传播机制
事务传播机制就是:多个事务⽅法存在调⽤关系时,事务是如何在这些⽅法间进⾏传播的
4.2 事务的传播机制种类
@Transactional 注解⽀持事务传播机制的设置,通过 propagation 属性来指定传播⾏为
Spring 事务传播机制有以下7种:
1. Propagation.REQUIRED :默认的事务传播级别.如果当前存在事务,则加⼊该事务.如果当前没 有事务,则创建⼀个新的事务.
2. Propagation.SUPPORTS :如果当前存在事务,则加⼊该事务.如果当前没有事务,则以⾮事务的 ⽅式继续运⾏.
3. Propagation.MANDATORY :强制性.如果当前存在事务,则加⼊该事务.如果当前没有事务,则 抛出异常.
4. Propagation.REQUIRES_NEW :创建⼀个新的事务.如果当前存在事务,则把当前事务挂起.也 就是说不管外部⽅法是否开启事务, Propagation.REQUIRES_NEW 修饰的内部⽅法都会新开 启⾃⼰的事务,且开启的事务相互独⽴,互不⼲扰.
5. Propagation.NOT_SUPPORTED :以⾮事务⽅式运⾏,如果当前存在事务,则把当前事务挂起(不 ⽤).
6. Propagation.NEVER :以⾮事务⽅式运⾏,如果当前存在事务,则抛出异常
7. Propagation.NESTED :如果当前存在事务,则创建⼀个事务作为当前事务的嵌套事务来运⾏. 如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED
总结
Spring中使⽤事务,有两种⽅式:编程式事务(⼿动操作)和声明式事务.其中声明式事务使⽤较多,在 ⽅法上添加 @Transactional 就可以实现了
通过 @Transactional(isolation = Isolation.SERIALIZABLE) 设置事务的隔离级别.Spring中的事务隔离级别有5种
通过@Transactional(propagation =Propagation.REQUIRED)设置事务的传播机制,Spring中的事务传播级别有7种,重点关注 REQUIRED (默认值)和 REQUIRES_NEW和NESTED
相关文章:
Spring事务和事务传播机制
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1.事务 1.1 什么是事务? 1.2 为什么需要事务? 1.3 事务的操作 2. Spring 中的事务 1. 编程式事务 2. 声明式事务Tra…...
STM32F103外部中断配置
一、外部中断 在上一节我们介绍了STM32f103的嵌套向量中断控制器,其中包括中断的使能、失能、中断优先级分组以及中断优先级配置等内容。 1.1 外部中断/事件控制器 在STM32f103支持的60个可屏蔽中断中,有一些比较特殊的中断: 中断编号13 EXTI…...
ChatGPT的应用场景:开启无限可能的大门
ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中…...
计算机毕业设计 | SpringBoot+vue社区医院管理系统(附源码+论文)
1,绪论 1.1 研究背景 互联网概念的产生到如今的蓬勃发展,用了短短的几十年时间就风靡全球,使得全球各个行业都进行了互联网的改造升级,标志着互联网浪潮的来临。在这个新的时代,各行各业都充分考虑互联网是否能与本行…...
直播实时美颜平台开发详解:基于视频美颜SDK的技术路径
视频美颜SDK作为实现实时美颜的关键技术,为开发者提供了高效、灵活的解决方案。本篇文章,小编将以“基于视频美颜SDK的技术路径”为主题,深入解析直播实时美颜平台的开发要点。 一、视频美颜SDK的作用与优势 视频美颜SDK是一种集成化的开发工…...
一个专为云原生环境设计的高性能分布式文件系统
大家好,今天给大家分享一款开源创新的分布式 POSIX 文件系统JuiceFS,旨在解决海量云存储与各类应用平台(如大数据、机器学习、人工智能等)之间高效对接的问题。 项目介绍 JuiceFS 是一款面向云原生设计的高性能分布式文件系统&am…...
【Elasticsearch】开启大数据分析的探索与预处理之旅
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
【算法】欧几里得与拓展欧几里得算法
目录 一、欧几里得算法 二、拓展欧几里得算法 2.1 裴蜀定理 2.2 拓展欧几里得算法 2.3 例题 三、线性同余方程 3.1 概念 3.2 例题 一、欧几里得算法 欧几里得算法又称辗转相除法,可用于求解两个数的最大公约数 其思路: gcd(a, b) gcd(b, a%b…...
组合数的求法
1.如果是多组查询的话,需要用数组去储存阶乘的值 n!/(m!(n-m)!) P4071 [SDOI2016] 排列计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<cstdio> #include<iostream> #include<map> #include<cstring> #include<cmath&g…...
【环境搭建】更新Docker Compose到v2.x版本以支持--profile选项
Docker版本陈旧也是搭建的环境起不来的一个重要原因,比如 --profile 选项是 Docker 20.10.0 版本及以上版本才开始支持的,在 Docker Compose v2.1(及以上版本)中引入用于对服务进行分组和按需启动。 更新 Docker Compose 到 v2.x…...
解决 java -jar 报错:xxx.jar 中没有主清单属性
问题复现 在使用 java -jar xxx.jar 命令运行 Java 应用程序时,遇到了以下错误: xxx.jar 中没有主清单属性这个错误表示 JAR 文件缺少必要的启动信息,Java 虚拟机无法找到应用程序的入口点。本文将介绍该错误的原因以及如何通过修改 pom.xm…...
AIGC-----AIGC在虚拟现实中的应用前景
AIGC在虚拟现实中的应用前景 引言 随着人工智能生成内容(AIGC)的快速发展,虚拟现实(VR)技术的应用也迎来了新的契机。AIGC与VR的结合为创造沉浸式体验带来了全新的可能性,这种组合不仅极大地降低了VR内容的…...
【博主推荐】C#的winfrom应用中datagridview常见问题及解决方案汇总
文章目录 1.datagridview绘制出现鼠标悬浮数据变空白2.datagridview在每列前动态添加序号2.1 加载数据集完成后绘制序号2.2 RowPostPaint事件绘制 3.datagridview改变行样式4.datagridview后台修改指定列数据5.datagridview固定某个列宽6.datagridview某个列的显示隐藏7.datagr…...
Selenium 自动化测试demo
场景描述: 模拟用户登录页面操作,包括输入用户名、密码、验证码。验证码为算数运算,如下: 使用到的工具和依赖: 1. Selenium:pip install selenium 2. 需要安装浏览器驱动:这里使用的是Edge 3…...
深度神经网络模型压缩学习笔记二:离线量化算法和工具、实现原理和细节
文章目录 一、离线量化基础概念二、离线量化难点三、离线量化算法介绍四、离线量化工具介绍五、离线量化工具整体设计结构六、离线量化工具代码解读七、实践:Dipoorlet量化MobileNet 一、离线量化基础概念 二、离线量化难点 三、离线量化算法介绍 四、离线量化工…...
uni-app运行 安卓模拟器 MuMu模拟器
最近公司开发移动端系统,使用真机时每次调试的时候换来换去的麻烦,所以使用模拟器来调试方便。记录一下安装和连接的过程 一、安装MuMu模拟器 百度搜索MuMu模拟器并打开官网或者点这里MuMu模拟器官网 点击下载模拟器 安装模拟器,如果系统…...
网络安全,文明上网(6)网安相关法律
列举 1. 《中华人民共和国网络安全法》: - 这是中国网络安全的基本法律,于2017年6月1日开始实施。该法律明确了网络运营者的安全保护义务,包括采取数据分类、重要数据备份和加密等措施。 2. 《中华人民共和国数据安全法》: …...
Perforce Automation With Python
11/2024 出版 MP4 |视频:h264, 19201080 |音频:AAC,44.1 KHz 语言:英语 |大小: 2.65 GB |时长: 5 小时 18 分钟 使用 Python 脚本简化与 Perforce 版本控制系统相关的生产流程 您将学 到什么 …...
卷积神经网络学习记录
目录 神经网络基础定义: 基本组成部分 工作流程 卷积层(卷积定义)【CONV】: 卷积层(Convolutional Layer) 特征提取:卷积层的主要作用是通过卷积核(或滤波器)运算提…...
Spring Cloud Alibaba
What is SCA Spring Cloud Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件,方便开发者通过Spring Cloud编程模型轻松使用这些组件来开发分布式应用服务。 依托Spring Cloud Alibaba,您只需要添加一些注解和少量…...
【AI绘画】Midjourney进阶:色调详解(上)
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯Midjourney中的色彩控制为什么要控制色彩?为什么要在Midjourney中控制色彩? 💯色调白色调淡色调明色调 💯…...
【滑动窗口】找到字符串中所有字母异位词
文章目录 找到字符串中所有字母异位词 class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> ret;int sLen s.size(), pLen p.size(), validChar;// 母串长度比子串长度还小 直接返回空vectorif (sLen < pLen)return ret;// …...
C++:final 关键字用于阻止类被继承或阻止虚函数被进一步重写
final 关键字的作用 C11 引入了 final 关键字,用于阻止类被继承或阻止虚函数被进一步重写。 防止类被继承:在类声明后添加 final,表示该类不能被继承。防止虚函数被重写:在虚函数声明后添加 final,表示该虚函数在派生…...
sql漏洞
目录 SQL漏洞产生的原因 未对用户输入进行验证和过滤: 动态SQL语句的拼接: 不安全的数据库配置: 缺乏安全意识和培训: 使用过时的技术或框架: 如何避免SQL漏洞产生 使用参数化查询: 对用户输入进行…...
SQL 复杂查询
目录 复杂查询 一、目的和要求 二、实验内容 (1)查询出所有水果产品的类别及详情。 查询出编号为“00000001”的消费者用户的姓名及其所下订单。(分别采用子查询和连接方式实现) 查询出每个订单的消费者姓名及联系方式。 在…...
在 PyTorch 训练中使用 `tqdm` 显示进度条
在 PyTorch 训练中使用 tqdm 显示进度条 在深度学习的训练过程中,实时查看训练进度是非常重要的,它可以帮助我们更好地理解训练的效率,并及时调整模型或优化参数。使用 tqdm 库来为训练过程添加进度条是一个非常有效的方式,本文将…...
PYNQ 框架 - 时钟系统 + pl_clk 时钟输出不准确问题
目录 1. 简介 2. PS 时钟计算 2.1 计算框架 2.2 KV260 的参考时钟 2.3 PL_CLK 设置 3. 测试 3.1 Block design 3.2 引脚绑定 3.3 使用 AD2 测量 3.4 调整分频 4. PYNQ 时钟驱动 4.1 源码解析 4.2 查看 PL_CLK 4.3 配置 PL_CLK 5. 总结 1. 简介 ZYNQ MPSoC 具有…...
【Reinforcement Learning】强化学习下的多级反馈队列(MFQ)算法
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
Cocos编辑器
1、下载 下载地址:https://www.cocos.com/creator-download 2、编辑器界面介绍 官方链接:https://docs.cocos.com/creator/3.8/manual/zh/editor/ 3、项目结构 官方链接:https://docs.cocos.com/creator/3.8/manual/zh/getting-started/…...
Linux kernel 堆溢出利用方法(三)
前言 本文我们通过我们的老朋友heap_bof来讲解Linux kernel中任意地址申请的其中一种比赛比较常用的利用手法modprobe_path(虽然在高版本内核已经不可用了但ctf比赛还是比较常用的)。在通过两道道近期比赛的赛题来讲解。 Arbitrary Address Allocation…...
文心一言与千帆大模型平台的区别:探索百度AI生态的双子星
随着人工智能技术的迅猛发展,越来越多的公司开始投入资源开发自己的AI解决方案。在中国,百度作为互联网巨头之一,不仅在搜索引擎领域占据重要位置,还在AI领域取得了显著成就。其中,“文心一言”和“千帆大模型平台”便…...
JavaWeb——SpringBoot原理
10.1. 配置优先级 10.1.1. 配置文件 properties > yml(推荐) > yaml 10.1.2. Java系统属性、命令行参数 命令行参数 > Java系统属性 > 配置文件 10.2. Bean管理 10.2.1. 手动获取bean ApplicationContext,IOC容器对象 10.2.2. bean作用域 10.2.3.…...
【算法】连通块问题(C/C++)
目录 连通块问题 解决思路 步骤: 初始化: DFS函数: 复杂度分析 代码实现(C) 题目链接:2060. 奶牛选美 - AcWing题库 解题思路: AC代码: 题目链接:687. 扫雷 -…...
Oracle RAC 环境下数据文件误建在本地目录的处理过程
问题描述 在 Oracle RAC 环境中,有时会误将数据文件创建在本地目录,导致其他节点无法访问该数据文件,从而报出 ORA-01157 和 ORA-01110 错误。 问题分析 错误日志 Mon Nov 16 19:02:38 2021 Errors in file /u01/app/oracle/diag/rdbms/orc…...
使用R语言绘制简单地图的教程
今天主要讲的部分是绘制静态地图,使用的R语言绘图包是tmap,关于介绍就不多讲,下面开始代码的讲解,小白也可以放心食用。 1、绘制简单的单幅地图,这里以新西兰地区为例 #导入必要的包 library(tmap) library(sp) libr…...
【人工智能】基于PyTorch的深度强化学习入门:从DQN到PPO的实现与解析
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 深度强化学习(Deep Reinforcement Learning)是一种结合深度学习和强化学习的技术,适用于解决复杂的决策问题。深度Q网络(DQN)和近端策略优化(PPO)是其中两种经典的算法,被广泛应用于游戏、机器人控…...
学习threejs,使用设置lightMap光照贴图创建阴影效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshLambertMaterial…...
类和对象(中)
文章目录 目录1. 类的6个默认成员函数2. 构造函数3. 析构函数4. 拷贝构造函数5. 赋值运算符重载5.1 运算符重载5.2 赋值运算符重载5.3 日期类实现 6. const成员函数7. 取地址及const取地址操作符重载 目录 类的6个默认成员函数构造函数析构函数拷贝构造函数赋值运算符重载cons…...
编程之路,从0开始:预处理详解(完结篇)
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:编程之路 这一篇预处理详解是我们C语言基础内容学习的最后一篇,也是我们的专栏ÿ…...
[chrome]黑色界面插件,PDF合并插件
Dark Reader_chrome插件下载,最新浏览器扩展,crx离线安装包 - 插件小屋 合并 PDF_chrome插件下载,最新浏览器扩展,crx离线安装包 - 插件小屋 下载的zip包解压成crx,然后把后缀名改为rar,然后解压,再导入解压的目录。...
【c语言】文件操作详解 - 从打开到关闭
文章目录 1. 为什么使用文件?2. 什么是文件?3. 如何标识文件?4. 二进制文件和文本文件?5. 文件的打开和关闭5.1 流和标准流5.1.1 流5.1.2 标准流 5.2 文件指针5.3 文件的打开和关闭 6. 文件的读写顺序6.1 顺序读写函数6.2 对比一组…...
AIGC--AIGC与人机协作:新的创作模式
AIGC与人机协作:新的创作模式 引言 人工智能生成内容(AIGC)正在以惊人的速度渗透到创作的各个领域。从生成文本、音乐、到图像和视频,AIGC使得创作过程变得更加快捷和高效。然而,AIGC并非完全取代了人类的创作角色&am…...
刷题日常(数据流中的中位数,逆波兰表达式求值,最长连续序列,字母异位词分组)
数据流中的中位数 描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()…...
Redis突然变慢,有哪些原因?
目录 一、存在bigkey 二、如果Redis 实例设置了内存上限 maxmemory,有可能导致 Redis 变慢 三、开启了内存大页 四、使用了Swap 五、网络带宽过载 六、频繁短连接 一、存在bigkey 如果Redis实例中存储了 bigkey,那么在淘汰删除 bigkey 释放内存时&…...
Qt入门1——认识Qt的几个常用头文件和常用函数
1.头文件 ① #include <QPushButton>——“按钮”头文件; ② #include <QLabel>——“标签”头文件; ③ #include <QFont>——“字体”头文件; ④#include <QDebug>——输出相关信息; 2. 常用函数/类的基…...
Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计
概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术,选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发,搭载了先进的勘智 K230D 芯片。 K230…...
CSS笔记(一)炉石传说卡牌设计1
目标 我要通过html实现一张炉石传说的卡牌设计 问题 其中必须就要考虑到各个元素的摆放,形状的调整来达到满意的效果。通过这个联系来熟悉一下CSS的基本操作。 1️⃣ 基本概念 在CSS里面有行元素,块元素,内联元素,常见的行元…...
怎么在宿主机上通过ssh连接虚拟机 VirtualBox 中的linux系统
通过 Xshell 连接 VirtualBox 中的 linux 虚拟机,您需要确保以下几个步骤都正确配置: 1. 配置 VirtualBox 网络 您需要将 VirtualBox 虚拟机的网络适配器设置为支持 SSH 连接的模式: 打开 VirtualBox,选择您的 Ubuntu 虚拟机&am…...
Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图
用户打开 PDF 文档时,他们会看到 PDF 的初始视图。默认情况下,打开 PDF 时不会显示书签面板或缩略图面板。在本文中,我们将演示如何设置文档属性,以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…...
241125学习日志——[CSDIY] [InternStudio] 大模型训练营 [17]
CSDIY:这是一个非科班学生的努力之路,从今天开始这个系列会长期更新,(最好做到日更),我会慢慢把自己目前对CS的努力逐一上传,帮助那些和我一样有着梦想的玩家取得胜利!!&…...