Spring事物和事务的传播机制

news2025/7/28 7:20:23

事务的定义:将一组操作封装到一个执行单元,要么全部成功,要么全部失败。

一、Spring中事务的实现

Spring中事务的操作分为两类:
1.编程式事务(手动写代码操作事务)
2.声明式事务(利用注解自动开启和提交事务)

1.1 Spring编程式事务

实现步骤:
a.开启事务
b.提交事务 / 回滚事务
在这里插入图片描述

package com.example.demo.controller;

import com.example.demo.model.UserInfo;
import com.example.demo.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private UserService userService;

    //事务管理器
    @Autowired
    private DataSourceTransactionManager transactionManager;
    //事务属性对象
    private TransactionDefinition transactionDefinition;

    @RequestMapping("/add")
    public int add(UserInfo userInfo){
        //获取事务(开启事务)
        TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);
        int result = userService.add(userInfo);
        log.info("添加结果:"+result);
        transactionManager.commit(transactionStatus);//提交事务
//        transactionManager.rollback(transactionStatus);//回滚事务
        return result;
    }
}

1.2 Spring声明式事务

添加注解@Transactional
无需手动开启事务和提交事务,进⼊方法时自动开启事务,方法执行完会自动提交事务,如果中途发生了没有处理的异常会自动回滚事务。
在这里插入图片描述
当中途发生了没有处理的异常,则数据不会进入数据库,而是会回滚。
在这里插入图片描述
在这里插入图片描述

1.2.1@Transactional 作用范围

1.Transactional既可以修饰类也可以修饰方法。
当修饰类时:表明该注解对当前类中所有被public修饰的方法都会生效(即会自动的开启和提交事务)
2.当修饰方法时:此注解只能用在public方法上,否则将会不生效。

1.2.2 @Transactional参数说明

在这里插入图片描述

1.2.3@Transactional注意事项

@Transactional在异常被捕获的情况下,不会进行事务的自动回滚。
在这里插入图片描述
解决方案:
1.可以将异常重新抛出
在这里插入图片描述
2.手动回滚事务
在这里插入图片描述

1.3@Transactional工作原理

@Transactional 是基于 AOP 实现的,AOP 又是使用动态代理实现的。@Transactional 在开始执行业务之前,通过代理先开启事务,在执行成功之后再提交事务。如果中途遇到异常,则回滚事务。

二、 事务隔离级别

2.1事务特性回顾

事务有四大特性(ACID),原子性、持久性、一致性、隔离性
1.原子性:一个事务中的所有操作,要么全部完成、要么全部不完成,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有被执行过一样。
2.一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。例如:转账的业务中,无论事务是否成功,转账者和收款人的总额应该不变。
3.隔离性:数据库允许多个并发事务同时对其数据进行读写和修改,并发访问数据库时,一个用户的事务不应该被其他事务所影响,各并发事务之间数据库是独立的。事务隔离有多个级别:读未提交、读已提交、可重复读、串行化。
4.持久性:一个事务被提交后,它对数据库中数据的改变是持久的。即便数据库发生故障也不应该对其有影响。
以上四种特性中只有隔离性是可以设置的,设置事务的隔离级别是用来保障多个并发事务执行更可控,更符合操作者的预期。

2.2Spring中事务的隔离级别

2.2.1Mysql事务隔离级别

有四种:
1.READ UNCOMMITTED:读未提交,该隔离级别的事务可以看到其他的事务没有提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此我们把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。
2.READ COMMITTED:读已提交,该隔离级别的事务能够读取到已提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间
的相同 SQL 查询中,可能会得到不同的结果,这种现象叫做不可重复读。
3.REPEATABLE READ:可重复读,是Mysql默认的事务隔离级别,它能够确保同一事物多次查询的结果一致。但也会出现幻读的问题。
4.SERIALIZABLE:序列化,事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。
在这里插入图片描述

脏读、不可重复读、幻读的具体解释:
1.脏读:当一个事务正在访问数据并对其进行了修改,但是还没提交事务,这时另外一个事务也访问了这个数据,然后使用了这个数据,因为这个数据的修改还没有提交到数据库,所以另外一个事务读取的数据就是“脏数据”,这种行为就是脏读。
2.不可重复读:指在一个事务内多次读取同一数据,在这个事务还没结束时,另一个事务也访问了这个数据并对这个数据进行了修改,那么就可能造成第一个事务两次读取的数据不一致,这种问题就叫不可重复读。
3.幻读:幻读与不可重复读类似,指一个事务读取了几行数据,这个事务还没结束,接着另外一个事务插入了一些数据,在随后的查询中,第一个事务读取到的数据就会比原本读取到的多,就好像发生了幻觉一样,所以称为幻读。

不可重复读与幻读的区别:
不可重复读的重点是修改,幻读的重点是新增或者是删除。

2.2.1Spring中事务的隔离级别

隔离级别的设置:
在这里插入图片描述
五种隔离级别:
在这里插入图片描述
1.Isolation.DEFAULT:以连接的数据库的事务隔离级别为主。
2. Isolation.READ_UNCOMMITTED:读未提交
3. Isolation.READ_COMMITTED:读已提交
4. Isolation.REPEATABLE_READ:可重复读
5. Isolation.SERIALIZABLE:串行化

三、Spring 事务传播机制

Spring 事务传播机制定义了多个包含了事务的方法,相互调⽤时,事务是如何在这些方法间进行传递的。
事务隔离级别是保证多个并发事务执行的可控性的(稳定性的),而事务传播机制是保证⼀个事务在多个调用方法间的可控性的(稳定性的)。

3.1事务的传播机制

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

传播机制分类:
在这里插入图片描述

3.2事务传播机制的设置

在这里插入图片描述
在这里插入图片描述

3.3嵌套事务

嵌套事务NESTED与加入事务 REQUIRED 的区别:
REQUIRED 如果回滚就是回滚所有事务,不能实现部分事务的回滚。但是嵌套事务不会回滚嵌套之前的事务,也就是说嵌套事务可以实现部分事务回滚。

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

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

相关文章

2023财年Q4业绩继续下滑,ChatGPT能驱动英伟达重回巅峰吗?

近年来,全球科创风口不断变换,虚拟货币、元宇宙等轮番登场,不少企业匆忙上台又很快谢幕,但在此期间,有些企业扮演淘金潮中“卖水人”的角色,却也能够见证历史且屹立不倒。不过,这并不意味着其可…

CSS 美化网页元素【快速掌握知识点】

目录 一、为什么使用CSS 二、字体样式 三、文本样式 color属性 四、排版文本段落 五、文本修饰和垂直对齐 1、文本装饰 2、垂直对齐方式 六、文本阴影 七、超链接伪类 1、语法 2、示例 3、访问时,蓝色;访问后,紫色; …

详解八大排序算法

文章目录前言排序算法插入排序直接插入排序:希尔排序(缩小增量排序)选择排序直接选择排序堆排序交换排序冒泡排序快速排序hoare版本挖坑法前后指针版本快速排序的非递归快速排序总结归并排序归并排序的非递归实现:计数排序排序算法复杂度及稳定性分析总结前言 本篇…

复杂场景的接口测试

测试场景一:被测业务操作是由多个API调用协作完成 背景:一个单一的前端操作可能会触发后端一系列的API调用,此时API的测试用例就不再是简单的单个API调用,而是一系列API的调用 存在的情况:存在后一个API需要使用前一个…

一文带你彻底搞懂Nginx反向代理

一文带你彻底搞懂Nginx反向代理一、什么是反向代理1.1 正向代理1.2 反向代理1.3 总结二、配置反向代理2.1 准备 Tomcat2.2 配置 Nginx一、什么是反向代理 1.1 正向代理 举一个通俗的例子,因为众所周知的原因,我们无法访问谷歌,但是因为某些…

Android:实现签名功能——signature-pad库

文章目录实现效果步骤1、添加 signature-pad 库的依赖。2、在 layout 文件中使用 SignaturePad 控件,另外添加“清空”和“保存”两个按钮。3、实现清空 SignaturePad 控件内容的功能4、实现保存 SignaturePad 控件内容的功能5、实现兼容Android10以下和Android10以…

同城创业有哪些优势可利用?本地外卖平台的行业优势可以利用

伴随着外卖市场的下沉,低线城市的用户开始大量使用外卖跑腿平台! 由于中国在线外卖行业逐渐成熟,一二线主流市场逐渐饱和,外卖行业逐渐向低线城市发展。2023年,三线及以下城市使用外卖平台的频率几乎等于一二线城市&a…

FreeRTOS入门(03):队列、信号量、互斥量

文章目录目的队列(queue)信号量(semaphore)互斥量(mutex)互斥量递归互斥量总结目的 FreeRTOS提供给用户最核心的功能是任务(Task),实际项目中通常会有多个任务&#xff…

【GO】K8s 管理系统项目9[API部分--Secret]

K8s 管理系统项目[API部分–Secret] 1. 接口实现 service/dataselector.go // secret type secretCell corev1.Secretfunc (s secretCell) GetCreation() time.Time {return s.CreationTimestamp.Time }func (s secretCell) GetName() string {return s.Name }2. Secret功能…

浅谈BOM

什么是BOM BOM对于每个前端都不陌生,但是很多人都停留在表面,而没有深层次的研究过它。JavaScript有一个非常重要的运行环境就是浏览器,而且浏览器本身又作为一个应用程序需要对其本身进行操作,所以通常浏览器会有对应的对象模型…

tidb ptca,ptcp考证

PingCAP 认证 TiDB 数据库专员 V6 考试(2023-02-23)https://learn.pingcap.com/learner/exam-market/list?categoryPCTA PingCAP 认证 TiDB 数据库管理专家(PCTP - DBA)认证考试范围指引 - ☄️ 学习与认证 - TiDB 的问答社区:lo…

Linux部署的Java应用生成图片和二维码会出现中文乱码的解决办法

Linux部署的Java应用生成图片和二维码会出现中文乱码,这是因为没有中文字体的原因,需要安装字体库。下载字体库https://download.csdn.net/download/a506602491/87490755,将文件解压至 /usr/share/fonts 目录下,如果没有fonts文件…

TRichView改进对HTML的支持并增强报告功能

TRichView改进对HTML的支持并增强报告功能 TRichView v21.0新功能: HTML导入和导出改进。 加载和保存的新方法。 改进图像选择和插入。 RichView Actions v11.0新功能: 包括加载和保存HTML的新方法。 使用新的TRVAControlPanel.OnChoosePicture事件选择…

[数据结构]链表OJ

目录 数据结构之链表OJ:: 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中倒数第k个结点 5.合并两个有序链表 6.链表分割 7.链表的回文结构 8.相交链表 9.环形链表 10.环形链表II 11.复制带随机指针的链表 数据结构之链表OJ:&#xff…

springboot自定义starter时使用@AutoConfigureBefore、@AutoConfigureAfter的细节问题

正常利用springboot的自动装配 ConfB Configuration(proxyBeanMethodsfalse) public class ConfB {public ConfB(){System.out.println("ConfB构造方式执行...");} }不加spring.factories 项目包结构 此时resources中没有spring.factories 执行结果 2023-02-24…

运动蓝牙耳机什么牌子好,运动蓝牙耳机品牌推荐

现在市面上运动耳机的品牌越来越多,还不知道选择哪一些运动耳机品牌,可以看看下面的一些耳机分享,运动耳机需要注意耳机的参数配置以及佩戴舒适度,根据自己最根本的使用需求来选择运动耳机。 1、南卡Runner Pro4骨传导蓝牙运动耳…

剑指 Offer 46. 把数字翻译成字符串

剑指 Offer 46. 把数字翻译成字符串 难度:middle\color{orange}{middle}middle 其实就是有条件的 青蛙跳格子 问题。 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,………

GitHub狂飙30K+star面试现场,专为程序员面试打造,现已开源可下载

《程序员面试现场》上线2个月已经在GitHub上已经狂飙到30Kstar(能在在GitHub上拿到30K的star,有没有干货,我就不多说了)总结的很全面,主要是针对面试之前的准备工作,分为知彼、知己、问答、贯通、综合五部分…

06- OpenCV查找图像轮廓 (OpenCV系列) (机器视觉)

知识重点 灰度图转换: gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)二值化: 返回两个东西,一个阈值, 一个是二值化的图: thresh, binary cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY)查找轮廓: 返回两个结果,分别是轮廓和层级: c…

白帽黑客入行应该怎么学?零基础小白也能轻松上手!

这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地,网络安全行业地位、薪资随之水涨船高。 1为什么网络安全行业是IT行业最后的红利? 根据腾讯安全发布的《互联网安全报告》,…