Spring事务和事务传播机制
目录
Spring中事务的实现
1、通过代码的方式手动实现事务
2、通过注解的方式实现声明式事务
2.1、@Transactional作用范围
2.2、@Transactional参数说明
2.3、注意事项
2.4、@Transactional工作原理
事务隔离级别
1、事务特性
2、Spring中设置事务隔离级别
2.1、MySQL事务隔离级别
2.2、Spring事务隔离级别
Spring事务传播机制
spring事务传播机制分类
1、Propagation.REQUIRED
2、Propagation.SUPPORTS
3、Propagation.MANDATORY
4、Propagation.REQUIRES_NEW
5、Propagation.NOT_SUPPORTED
6、Propagation.NEVER
7、Propagation.NESTED
Spring中事务的实现
1、通过代码的方式手动实现事务
@Autowiredprivate DataSourceTransactionManager transactionManager;@Autowiredprivate TransactionDefinition transactionDefinition;//1、开启事务TransactionStatus transactionStatus=transactionManager.getTransaction(transactionDefinition);//手动设置创建时间和修改时间的默认值userinfo.setCreatetime(LocalDateTime.now().toString());userinfo.setUpdatetime(LocalDateTime.now().toString());//2、回滚事务//transactionManager.rollback(transactionStatus);//3、提交事务transactionManager.commit(transactionStatus);
2、通过注解的方式实现声明式事务
@Transactional
1、可以添加在类上或方法上
2、在方法执行前自动开启事务,在方法执行完(没有任何异常)自动提交事务,但是如果在方法执行期间出现异常,那么将自动回滚事务
@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);System.out.println("添加:"+result);return result;}
2.1、@Transactional作用范围
修饰方法时:只能用到public方法上,否则不生效
修饰类时:表明该注解对该类中所有的public方法都生效
2.2、@Transactional参数说明
| 参数 | 说明 |
| value | 当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器。 |
| transactionManager | 当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器. |
| propagation | 事务的传播行为默认值为Propagation.REQUIRED |
| isolation | 事务的隔离级别,默认值为Isolation. DEFAULT |
| timeout | 事务的超时时间,默认值为-1如果超过该时间限制但事务还没有完成则自动回滚事务. |
| readOnly | 指定事务是否为只读事务默认值为false;为了忽略那些不需要事务的方法比如读取数据,可以设置read-only为true. |
| rollbackFor | 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。 |
| rollbackForClassName | 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型. |
| noRollbackFor | 抛出指定的异常类型不回滚事务,也可以指定多个异常类型 |
| noRollbackForClassName | 抛出指定的异常类型.不回滚事务,,也可以指定多个异常类型 |
2.3、注意事项
当程序中有try-catch。及时程序发生异常,事务也不会回滚
@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);System.out.println("添加:"+result);try {int num=10/0;} catch (Exception e) {System.out.println(e.getMessage());}return result;}
解决方法:
1、将异常抛出去
@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);System.out.println("添加:"+result);try {int num=10/0;} catch (Exception e) {//将异常继续抛出throw e;}return result;}
2、使用代码手动回滚事务
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
2.4、@Transactional工作原理

事务隔离级别
1、事务特性
原子性
一致性
持久性
隔离性
2、Spring中设置事务隔离级别
2.1、MySQL事务隔离级别
| 事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
| 读未提交(READ UNCOMMITTED) | √ | √ | √ |
| 读已提交(READ COMMITTED) | × | √ | √ |
| 可重复读(REPEATABLE READ) | × | × | √ |
| 串行化(SERIALIZABLE) | × | × | × |
2.2、Spring事务隔离级别
1. Isolation.DEFAULT: 以连接的数据库的事务隔离级别为主。
2. Isolation.READ. _UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。
3. Isolation.READ. COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。
4. Isolation.REPEATABLE READ:可重复读,解决了不可重复读,但存在幻读(MySQL默认级别)。
5. Isolation.SERIALIZABLE: 串行化,可以解决所有并发问题,但性能太低。
通过设置@Transactional里的isolation属性即可
Spring事务传播机制
spring事务传播机制分类
1、Propagation.REQUIRED
默认传播机制,如果调用链存在事务,则加入事务,如果不存在则创建事务

2、Propagation.SUPPORTS
如果调用链存在事务,则加入事务;如果不存在则非事务方式运行

3、Propagation.MANDATORY
强调必须有事务

4、Propagation.REQUIRES_NEW

5、Propagation.NOT_SUPPORTED

6、Propagation.NEVER

7、Propagation.NESTED

嵌套事务和加入事务的区别:
1、整个事务如果全部执行成功,二者的结果是一样的;
2、如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部会滚,不会影响上一个方法中执行的结果
相关文章:
Spring事务和事务传播机制
目录 Spring中事务的实现 1、通过代码的方式手动实现事务 2、通过注解的方式实现声明式事务 2.1、Transactional作用范围 2.2、Transactional参数说明 2.3、注意事项 2.4、Transactional工作原理 事务隔离级别 1、事务特性 2、Spring中设置事务隔离级别 2.1、MySQL事…...
基于OpenCV+CUDA实时视频抠绿、背景合成以及抠绿算法小结
一、关于抠绿 百度百科上描述抠绿“抠绿是指在摄影或摄像时,以绿色为背景进行拍摄,在后期制作时使用特技机的“色键”将绿色背景抠去,改换其他更理想的背景的技术。”绿幕的使用已经非常普遍,大到好莱坞大片,小到自媒体的节目,一些商业娱乐场景,几乎都用使用。但是很多非…...
MySQL 中的 UNION 语句
文章目录一、数据准备一、UNION 和 UNION ALL二、UNION 的执行顺序(UNION 和其他语句一同出现)三、MySQL 使用 UNION(ALL) ORDER 导致排序失效四、UNION 报错语法一、数据准备 -- 创建表 CREATE TABLE test_user (ID int(11) NO…...
高完整性系统工程(三): Logic Intro Formal Specification
目录 1. Propositions 命题 2.1 Propositional Connectives 命题连接词 2.2 Variables 变量 2.3 Sets 2.3.1 Set Operations 2.4 Predicates 2.5 Quantification 量化 2.6 Relations 2.6.1 What Is A Relation? 2.6.2 Relations as Sets 2.6.3 Binary Relations as…...
【linux】多线程概念详述
文章目录一、线程基本概念1.1 进程地址空间与页表1.2 页表结构1.3 线程的理解1.3.1 如何描述线程1.4 再谈进程1.5 代码理解1.5.1 原生库提供线程pthread_create1.6 资源共享问题1.7 资源私有问题二、总结2.1 什么是线程2.2 并行与并发2.3 线程的优点2.4 线程的缺点2.5 线程异常…...
【Java】P8 面向对象(3)方法 基本知识
面向对象 方法方法方法的声明权限修饰符返回值类型方法名形参列表方法体简单案例方法 方法 是对类或对象行为特征的抽象,用来完成某个功能的操作。方法的目的 是为了实现代码复用,减少冗余,简化代码;方法不能独立存在,…...
js中null和undefined的区别
js中null和undefined的区别?这也是一个常见的js面试题 相同点 1,都是基本类型。 2,做判断值都是false。 !!null false // true !!undefined false // true不同点 1,诞生时间null在前,undefined在后。因为js作者Brendan-Eic…...
【Linux】linux中的c++怎么调试?gdb的介绍和使用。
背景1.1.前提知识程序的发布方式有两种,debug模式和release模式Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项windows上的调试方法有区别吗?1.调试思路是一样的2…...
提升Python代码性能的六个技巧
文章目录前言为什么要写本文?1、代码性能检测1.1、使用 timeit 库1.2、使用 memory_profiler 库1.3、使用 line_profiler 库2、使用内置函数和库3、使用内插字符串 f-string4、使用列表推导式5、使用 lru_cache 装饰器缓存数据6、针对循环结构的优化7、选择合适算法…...
VI的常用命令
VI的常用命令 文章目录VI的常用命令vi/vim是什么?VI普通模式命令VI编辑模式命令VI指令模式vi/vim是什么? VI是Unix操作系统和类Unix操作系统中最通用的文本编辑器 VIM编辑器是从VI发展出来的一个性能更强大的文本编辑器。可以主动的将字体颜色辨别语法…...
【数据结构】万字深入浅出讲解单链表(附原码 | 超详解)
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:C语言实现数据结构 💬总结:希望你看完…...
无线WiFi安全渗透与攻防(五)之aircrack-ng破解WEP加密
系列文章 无线WiFi安全渗透与攻防(一)之无线安全环境搭建 无线WiFi安全渗透与攻防(二)之打造专属字典 无线WiFi安全渗透与攻防(三)之Windows扫描wifi和破解WiFi密码 无线WiFi安全渗透与攻防(四)之kismet的使用 aircrack-ng破解WEP加密 1.WEP介绍 其实我们平常在使用wifi的时…...
MySQL中事务的相关问题
事务 一、事务的概述: 1、事务处理(事务操作):保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit…...
推荐算法再次踩坑记录
去年搞通了EasyRec这个玩意,没想到今年还要用推荐方面的东西,行吧,再来一次,再次踩坑试试。1、EasyRec训练测试数据下载:git clone后,进入EasyRec,然后执行:bash scripts/init.sh 将…...
STM32 (十五)MPU6050
简介前言一、MPU6050简介MPU6050是一款性价比很高的陀螺仪,可以读取X Y Z 三轴角度,X Y Z 三轴加速度,还有内置的温度传感器,在姿态解析方面应用非常广泛。下面是它在淘宝上的参数图产品尺寸产品参数产品原理图:二、硬…...
使用yarn,依赖报各种错误怎么办
使用 yarn^3.x 版本时,默认并不会安装包到 node_modules,因为 yarn3.x 是即插即用的,也就是说如果你下载过这个包,yarn只会生成一个 Png文件,然后将包的路径 link 到下载过的地方,这样可以省去很多时间。而…...
面试官:rem和vw有什么区别
"rem" 和 "vw"的区别 "rem" 和 "vw" 都是用于网页设计的CSS单位。 "rem" 是相对于根元素的字体大小来计算的单位,即相对于 "html" 标签的字体大小。例如,如果 "html" 标签的字…...
【GPT-4】GPT-4 相关内容总结
目录 编辑 官网介绍 GPT-4 内容提升总结 GPT-4 简短版总结 GPT-4 基础能力 GPT-4 图像处理 GPT-4 技术报告 训练过程 局限性 GPT-4 风险和应对措施 开源项目:OpenAI Evals 申请 GPT-4 API API的介绍以及获取 官网介绍 官网:GPT-4 API候…...
5.springcloud微服务架构搭建 之 《springboot集成Hystrix》
1.springcloud微服务架构搭建 之 《springboot自动装配Redis》 2.springcloud微服务架构搭建 之 《springboot集成nacos注册中心》 3.springcloud微服务架构搭建 之 《springboot自动装配ribbon》 4.springcloud微服务架构搭建 之 《springboot集成openFeign》 目录 1.项目…...
【工作中问题解决实践 七】SpringBoot集成Jackson进行对象序列化和反序列化
去年10月份以来由于公司和家里的事情太多,所以一直没有学习,最近缓过来了,学习的脚步不能停滞啊。回归正题,其实前年在学习springMvc的时候也学习过Jackson【Spring MVC学习笔记 五】SpringMVC框架整合Jackson工具,但是…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
