当前位置: 首页 > news >正文

Spring事务及事务传播机制

一.事务的含义:多个操作封装在一起,要么同时执行成功,一旦有一个操作执行失败,那么全部执行失败。这里给大家举个例子:比如A给B转账50元,而B没有收到这50元,此时A转账B这个操作也需要进行回滚,恢复到A给B没转账的状态,不然A转账给B的钱就凭空消失了。

二.Spring中事务的实现

1.编程式事务(手动写代码操作事务)

2.声明式事务(利用注解自动开启开启和提交事务

1.编程式事务

 SpringBoot为我们内置了两个对象,DataSourceTransactionManager用来获取、提交、回滚事务TransactionDefinition用来定义 事务的属性。

2.声明式事务

在类上添加或方法上添加@Transactional注解,会自动帮我们声明事务,当进入方法时,自动开启事务,当方法结束后,自动帮我们提交事务,当遇到异常的时候,自动的回滚事务

当出现异常的时候,会自动帮我们回滚事务

如果我们加上try catch来处理这个异常的话,那么事务就不会回滚了

那像这种情况,因为它出现了异常就需要回滚,但是因为他被try catch捕获了,不能自动回滚了,我们应该如何解决呢?

(1)手动将这个异常抛出

(2)手动回滚事务 

 

 @Transactional作用范围:

当修饰在类上的时候,只有public修饰的方法才生效

当修饰在方法的时候,只有public作为此方法的修饰符时才会生效

 @Transactional参数

三.@Transactional ⼯作原理
Transactional 是基于 AOP 实现的,AOP ⼜是使⽤动态代理实现的。如果⽬标对象实现了接⼝,默 认情况下会采⽤ JDK 的动态代理,如果⽬标对象没有实现了接⼝,会使⽤ CGLIB 动态代理。
Transactional 在开始执⾏业务之前,通过代理先开启事务,在执⾏成功之后再提交事务。如果中途 遇到的异常,则回滚事务。

 

四.Spring事务的隔离级别:

Spring通过isolation属性来设置事物的隔离级别

Isolation.DEFAULT :以链接的数据库隔离级别为准

Isolation.READ_UNCOMMITTED:读未提交,会产生脏读和幻读和不可重复读的问题
Isolation.READ_COMMITTED:读已提交,不会产生脏读的问题,但会产生不可重复读、幻读的问题
Isolation.REPEATABLE_READ:可重复读(Mysql数据库的默认事务隔离级别),会产生幻读的问题
Isolation.SERIALIZABLE:串行化,能解决所有的并发问题,但效率太低
脏读:A事务在写完数据后并没有进行提交,B事务读取完数据,A事务进行回滚
不可重复读:A事务写完数据后提交事务,B数据进行读取,此时A事务再将提交后的数据进行修改然后再提交,此时B事务前后读取的数据是不一样的。
幻读:A事务两次查询得到的结果集不同,因为B事务新增了一部分数据
spring的事务隔离级别比mysql的事务隔离级别多了一种,多了Isolcation.DEFAULT
五.Spring事务的传播机制:
解决的是一个事务再多个方法里被调用的问题

 事务的传播机制一共分为7种:

 下面我们分别从这三类当中取出一种事务来进行演示

1.propagation=Propagation.REQUIRED

支持当前事务:所有的事务执行成功才算成功,一旦有一个事务进行回滚,所有的事务都会进行回滚

 

我们发现报500了 

我们进行访问,此时因为LogService这个类中事务声明的方法里出现了异常,这个事务会进行回滚所以log这条数据不会插入成功,而xiaohzang这条数据也不会插入成功,这是因为它并不会创建新的事务,而是加入到当前事务,此时两个事务可以看成是一个事务,一旦有一个事务进行回滚,其他的事务也会进行回滚。

如果我们把LogService里的那个事务声明的方法里的异常改为手动回滚

此时也会报异常,这是因为内部事务要回滚,但是外部事务感知自己没有异常和手动回滚自己应该要提交,此时外部事务就不知道咋处理了,于是就报异常了,不过最终还是都要回滚 。

2.propagation = Propagation.REQUIRES_NEW

不支持当前事务:各个事务之间不会相互影响,一个事务的回滚不会影响其他的事务。

我们的预期结果是log这条数据不会插入成功,但xiaozhang这条数据会成功插入到用户表中,我们执行一下看一下结果

我们发现500了,查看userinfo数据表,xiaozhang这条数据并没有插入成功 

 这又是为什么呢?因为异常会让所有的事务都感知到然后都会进行回滚

为了更好的演示,我们将异常改为手动回滚

 此时我们再进行访问:

我们查看一下数据库

log这条数据因为进行事务回滚了并没有插入成功

LogService里的这个事务进行回滚,并没有影响其他事务,所以 xiaohzhang这条数据成功插入userinfo表中了

 3.propagation=Propagation.NESTED

嵌套事务:事务之间不相互影响,一个事务的回滚不影响其他事务

 log中并没有插入数据

userinfo表中插入数据了

嵌套事务能实现部分事务回滚的原因:嵌套事务之所以 能够实现部分事务的回滚,是因为事务中有一个保存点的概念,嵌套事务进入之后建立了一个新的保存点,回滚时只回滚到当前保存点,而之前的事务不受影响。

 支持事务(REQUIRED)和嵌套事务(NESTED)的区别:

1.如果所有的事务都执行成功,那么最终结果两者都执行成功

2.支持事务里一旦有一个事务进行回滚,那么所有的事务都会回滚,而嵌套事务会局部回滚,不影响其他事务。

相关文章:

Spring事务及事务传播机制

一.事务的含义:多个操作封装在一起,要么同时执行成功,一旦有一个操作执行失败,那么全部执行失败。这里给大家举个例子:比如A给B转账50元,而B没有收到这50元,此时A转账B这个操作也需要进行回滚,恢复到A给B没…...

npm i 常见问题

需要注意的是,如果你在使用 NPM 安装包的过程中遇到了任何问题,可以尝试使用 --verbose 参数打印更详细的错误信息,以便更好地诊断问题。例如: npm install --verbose 1、vue老项目缺少编译环境安装依赖报错的问题 待下载的项目…...

Prometheus+Grafana监控系统

一、简介 1、Prometheus简介 官网:https://prometheus.io 项目代码:https://github.com/prometheus Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目,拥有非常活跃的开发人员…...

基于脉冲神经网络的物体检测

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 研究的意义在于探索脉冲神经网络在目标检测上的应用,目前主流的脉冲神经网络训练算法有直接BP训练、STDP无监督训练和训练好的ANN的转化,虽然训练算法众多,但是SNN仍然没有一套成熟的训练算…...

Rust每日一练(Leetday0010) 子串下标、两数相除、串联子串

目录 28. 找出字符串中第一个匹配项的下标 Find-the-index-of-the-first-occurrence-in-a-string 🌟🌟 29. 两数相除 Divide Two Integers 🌟🌟 30. 串联所有单词的子串 Substring-with-concatenation-of-all-words &#x…...

As ccess 数据库与表的操作

1. Access 数据库设计的一般步骤 . 2. 基本概念:Access 数据库、表、记录、字段 . 3. 使用表设计器创建表 (1)字段名命名规则 不能空格开头、不能用.!()[]、最长 64 个字符 (2)字段类型:文本、数字、日期/时…...

自动化的测试工具

1, 自动化功能测试工具:QTP、selenium 2, 自动化性能测试功能:LoadRunner、jmeter 3, 自动化接口测试工具:Charles、soapUI、LoadRunner、jmeter、postman、 测试工具 4, 测试管理工…...

Host头攻击

转载与:https://blog.csdn.net/weixin_47723270/article/details/129472716 01 HOST头部攻击漏洞知识 Host首部字段是HTTP/1.1新增的,旨在告诉服务器,客户端请求的主机名和端口号,主要用来实现虚拟主机技术。 运用虚拟主机技术&a…...

Android 12.0默认开启无障碍服务权限和打开默认apk无障碍服务

1.概述 在12.0的系统rom定制化开发中,在第三方app开发中,需要开启无障碍服务功能,就不需要在代码中开启无障碍服务了, 为了简便就需要在系统中开启无障碍服务,来实现开启无障碍服务功能 2. 默认开启无障碍服务权限和打开默认apk无障碍服务核心代码 frameworks/base/core…...

怎么成为优秀的软件工程师,而不是优秀的码农?

作为软件行业的从业者,每个人都希望最终成为优秀的软件工程师,而不仅仅是码农。一个码农只关注于编写代码和解决问题,而一个软件工程师则涉及到更广泛的职责和技能。 以下是一些要点,可以帮助你脱颖而出,成为一个优秀…...

安装ElasticSearch之前的准备工作jdk的安装

一.windows 下载jdk的软件 (1).进入jdk1.8官网 (2).根据电脑是32位还是64位按需下载 (3).点击下载之后就会跳转到Oracle账号登录界面 没有 Oracle账号的注册一下就可以了 下载好的jdk如下: 双击下一步下一步安装jdk 默认安装就可以了 配置环境变量 (1).电脑左下方设置选项 (2).…...

复杂数据集,召回、精度等突破方法记录【以电科院过检识别模型为参考】

目录 一、数据分析与数据集构建 二、所有相关的脚本 三、模型效果 一、数据分析与数据集构建 由于电科院数据集有17w-18w张,标签错误的非常多,且漏标非常多,但是所有有效时间只有半个月左右,显卡是M60,训练速度特别…...

那些你不得不会的提高工作效率的软件神器

那些你不得不会的提高工作效率的软件神器 文本编辑器 vscode 跨平台,插件丰富。 code-server vscode服务器版本,可以在浏览器中开发调试代码,尤其适用于windows端开发linux服务器程序。 vim linux/unix/mac终端最强大的文本编辑器。 note…...

【VMware】Ubunt 20.04时间设置

文章目录 设置本地时间 UTC8设置24小时制同步网络时间参考 Talk is cheap, show me the code. 设置本地时间 UTC8 查看当前时区状态 rootnode1:~/k8s# timedatectlLocal time: Sun 2023-05-21 15:24:02 CSTUniversal time: Sun 2023-05-21 07:24:02 UTCRTC time: Sun 2023-05-2…...

单点登录三:添加RBAC权限校验模型功能理解及实现demo

1、RBAC权限模型 RBAC(Role-Based Access Control)是一种基于角色的访问控制模型,用于管理系统中用户的权限和访问控制。它将用户、角色和权限之间的关系进行了明确的定义,以实现灵活的权限管理和控制。 1.1、RBAC模型主要包括以…...

基于用户认证数据构建评估模型预测认证行为风险系统(附源码)

文件说明 datasets // 数据集(训练集、测试集) feature engineering // 特征工程 models // 评估模型 测试环境 Python3.8 任务描述 项目来自系统认证风险预测https://www.datafountain.cn/competitions/537 项目完整源码下载:https://download.csdn.net/download/liu…...

本地训练中文LLaMA模型实战教程,民间羊驼模型,24G显存盘它!

羊驼实战系列索引 博文1:本地部署中文LLaMA模型实战教程,民间羊驼模型 博文2:本地训练中文LLaMA模型实战教程,民间羊驼模型(本博客) 博文3:精调训练中文LLaMA模型实战教程,民间羊驼模型(马上发布) 简介 在学习完上篇【1本地部署中文LLaMA模型实战教程,民间羊驼模…...

快速学Go依赖注入工具wire

Go相对java和C是较新的语言,但也有诸多优秀特性及生态库。本文介绍大多数软件工程中常用的功能:依赖注入。首先介绍什么是依赖注入,go实现库wire与其他语言的差异。然后通过简单示例实现依赖注入,简化代码、提升可读性。 依赖注入…...

python入门(4)流程控制语句

1. 条件判断语句 条件控制语句用于根据条件来决定程序的执行路径。在Python中,常见的条件控制语句有以下几种: (1)if语句:用于执行满足条件的代码块。示例代码: age 20 if age > 18:print("成年…...

【进阶】C 语言表驱动法编程原理与实践

数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结构,而不是算法。——Rob Pike 目录 说明 概念提出 查表方式 直接查找 索引查找 分段查找 实战示例 字符统计 月天校验 名称构造 值名…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

云原生安全实战:API网关Kong的鉴权与限流详解

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...