SpringBoot——业务层测试事务回滚

news2024/9/20 14:33:05

事务回滚

关于事务回滚的概念我们之前在学习数据库的时候已经提到过了,这里我们再次强化一下记忆。所谓的事务回滚就是在执行多条SQL语句的时候,如果其中一条SQL出现了异常导致执行失败,则数据库的状态回滚到执行多条SQL语句之前的状态,就防止你执行的之后一次一次的添加脏数据。
其实这个也很好理解啊,因为SQL的执行是一种命令,你做了什么操作只要成功了就会直接更改数据库的状态,他不想是代码,你可以反复的一遍一遍的测试,不会对环境造成任何的影响,所以这里就出现了一个问题。
我们之前在测试业务层的时候,会调用DAO层的接口向数据库中写数据,那么这个过程我们写进去了就是写进去了,他就会保存在数据库中,那么如何在我们测试的时候制作测试,并不要真实的写入数据。这时候就需要我们的事务出场了,事务的概念并不局限于MySQL中的存储过程或者SQL脚本,你的Java方法中包含了多条SQL语句的执行那也算作是一个事务,那么我们直接不提交事务,他也就不会写入数据了。
那么我们就介绍一下如何在测试中控制事务的提交。

事务的提交

首先我们要搭建一个基础的环境,就是准备好DAO层和service层,并且在测试方法中调用service层的方法。
在这里插入图片描述
只需要创建Dao层和Service层即可,有基本的功能即可,需要注意的是我们这里需要有一个插入数据的SQL语句,这样我们才能测试事务的回滚。
在这里插入图片描述
先看一下现在的数据库中的状态,现在是没有任何的数据的空表,那么我们创建一个测试:
在这里插入图片描述
我们模拟一下对Service层的插入数据的过程,我们可以运行测试方法进行测试,也可以使用Mavne的test生命周期进行测试,只要最终能运行测试代码就可以:
在这里插入图片描述
这里我使用了Maven的test生命周期进行测试,然后他将我们的测试代码运行了一遍,我们看一下数据的现在的状态:
在这里插入图片描述
可以看到这里多出了一行数据,这个数据就是我们在测试的时候执行代码的时候持久化就去的一行数据,那么如何让我们在做测试的时候不出现这个数据呢,就需要我们添加一个新的注解,叫做@Transactional,这个注解的出现,就表示当前测试类,不提交事务。
这个注解是如何控制事务的提交的呢,是靠着另一个注解,@RollBack注解来控制事务的提交的。
在这里插入图片描述
当我们添加了@Tianscational注解的时候,他里面会调用一个@Rollback注解,这个注解就是控制事务是否提交的注解,默认值是true也就是提交事务,这时候数据就不能被写入数据,但是当值设置为false的时候,这时候即使有@Tianscational注解存在也依旧不能回滚事务,而是正常的写入数据。但是单独使用@Rollback注解是不起作用的。

自动主键自增在回滚状态下依然会增加

在测试的时候,即使在数据库中看到没有写入数据,但是依然会让自增主键增长,也就是说这时候SQL语句其实是执行成功的,只不过是没有写入数据而已,现在我们注掉@Transcational注解,再次执行测试看一下数据库中的数据:
在这里插入图片描述
执行测试代码之后,现在数据库中的数据只有两条,但是自增的id已经涨到了7,其实应该是依次增长的,我测试的时候出了点Bug删了几条,但是道理是一样的,就是我们虽然测试的时候没有写入数据,但是id自增还是发生了,这个要注意一下。

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

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

相关文章

第六章:YOLO v1网络详解(统一的实时目标检测)

(目标检测篇)系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:Mask R-CNN网络详解 第六章:YOLO v1网络详解 第七章:YOLO v2网络详解 第八章:YOLO v3网络详解 文章目录 系列文章目录技…

一起学SF框架系列5.7-模块Beans-BeanDefinition定义

在SF下,开发人员用xml或注解模式定义bean,框架把这些定义转化为内部BeanDefinition类,然后通过BeanDefinition类实现Bean的管理(包括初始化、依赖注入及生命周期管理),因此了解Bean的定义、解析、使用过程非…

[kafka] windows下安装kafka(含安装包)

[kafka] windows下安装kafka(含安装包) 目录 前言 一、下载kafka安装包 1)下载安装包 2)解压安装包 二、运行zookeeper 1.运行zookeeper(因为kafka必须要和zookeeper一起运行) 三、运行kafka 四、使用fafka…

web3创业有哪些机会及具体案列(二)

目录 1. 去中心化金融(DeFi):2. 去中心化身份验证和数字身份:3. 去中心化市场和电子商务:4. 区块链游戏和虚拟资产:5. 数据隐私和安全:6. 去中心化社交媒体:7. 去中心化能源交易&…

Spring容器扩展点在微服务中的使用

(20230306)Spring容器扩展点在微服务中的使用 文章目录 1. Spring扩展点梳理2.Spring扩展点应用场景2.1 整合NacosApplicationListener扩展场景——监听容器中发布的事件Lifecycle扩展场景——管理具有启动、停止生命周期需求的对象 2.2 整合RibbonSmartInitializingSingleton扩…

定时器中断实验(stm32)

目录 TIME的代码time.ctime.h main.c TIME的代码 time.c void TIM3_Int_Init(u16 arr,u16 psc) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能//定时器TIM3初始化…

uview u-input 点击清除按钮,数据清空但视图未清空

问题描述&#xff1a; 点击 uview 的 u-input 输入框自带的清除按钮&#xff0c;v-model 绑定的数据清空了&#xff0c;但是输入框内还显示着之前的数据 解决方案&#xff1a; 将 v-model 绑定的值写到 data 初始变量中声明 原始代码&#xff1a; <u-input v-model"…

Spring对事务的支持

目录 事务的传播行为 一、什么是事务的传播行为 二、7种事务传播行为 1. REQUIRED 2. REQUIRES_NEW 3. NESTED 4. 总结 三、事务的传播行为&#xff08;理解记忆&#xff09; 转载&#xff1a;一个99%的人都说不清楚知识点——Spring 事务传播行为 - 哔哩哔哩 事务属性…

2023.7.7HCIA中静态路由

一、题目要求 需求&#xff1a; 1.所有节点的IP地址均属于192.168.1.0 24--子网划分 2.全网可达--静态 3.加快收敛&#xff08;尽量汇总&#xff09; 5.R6存在环回接口--6.6.6.6 24&#xff0c;不能直接写去往6.6.6.0网段的路由--缺省 6.没有环路--NUll 0 7.正常流量走100M&am…

什么是ERC20?

ERC20 是以太坊区块链上最常见的代币标准之一。它是以太坊上智能合约的一种协议&#xff0c;定义了一套规则和接口&#xff0c;使得在以太坊网络上创建和管理代币变得更加简单和标准化。 ERC20 代币标准定义了一组功能和方法&#xff0c;以便代币合约可以与其他合约和钱包进行…

dxSpreadSheetReportDesigner使用笔记

通过该控件达到显示主从表,效果如下图所示. 在界面上放置以下控件 1.新建主从表主表为tab1,从表为tab2,二表通过设置从表的mastersource及MasterFields与从表联动. 2.设置dxspreadsheetreportdesigner与主从表关联 在DataBinding中的datasource关联主从. 在details中关联从表…

UE5、CesiumForUnreal接入XYZ格式地图瓦片如高德地图、OSM、ArcGIS等

文章目录 1.实现目标2.实现过程2.1 XYZ与TMS对比2.1 cesium-native改造2.3 CesiumForUnreal插件改造2.4 XYZ瓦片加载测试3.参考资料1.实现目标 通过改造cesium-native和cesiumforunreal插件,参考tms的栅格地图瓦片加载逻辑,实现在UE5、CesiumForUnreal中接入XYZ格式的地图瓦片…

-Xmx20m -Xms5m

-Xmsjava程序启动时初始堆的大小&#xff0c;默认是物理内存的1/64-Xmxjava程序能获得的最大堆的大小&#xff0c;默认为物理内存的1/4 验证默认值 winr → systeminfo 配置JVM启动参数&#xff1a;-XX:PrintCommandLineFlags-XX:ConcGCThreads3 -XX:G1ConcRefinementThreads…

UEditor v1.4.3.3 .net版本任意文件上传 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 影响范围03 验证方式04 利用方式05 实战案例06 修复方案 01 漏洞描述 UEditor是一款所见即所得的开源富文本编辑器&#xff0c;具有轻量、可定制、用户体验优秀等特点&#xff0c;被广大…

flutter聊天界面-加号【➕】更多展开相机、相册等操作Panel

flutter聊天界面-加号【➕】更多展开相机、相册等操作Panel 在之前实现了flutter聊天界面的自定义表情的展示&#xff0c;这里记录一下更多操作展开的相机、相册等操作功能实现。 一、查看效果 更多操作展开的相机、相册等操作功能实现。 二、代码实现 展开的操作按钮可能比…

前端(四)——vue.js、vue、vue2、vue3

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;vue.js、vue、vue2、vue3从全局到局部 文章目录 vue.js、vue、vue2、vue3是什么关系?Vue.js简介发展历程特点与优势生态系统Vue.js基础知识安装与配置 基本语法Vue.js主要版本解析Vue.js 2.x vue2…

python 第十一章 文件操作

系列文章目录 第一章 初识python 第二章 变量 第三章 基础语句 第四章 字符串str 第五章 列表list [] 第六章 元组tuple ( ) 第七章 字典dict {} 第八章 集合set {} 第九章 常用操作 第十章 函数 文章目录 系列文章目录11.1文件操作的作用11.2文件的基本操作打开打开文件模式 …

string底层是如何实现的

前言 在我们学习的时候总是会用到string&#xff0c;知道它具备各种功能&#xff0c;它也是一种很强大的模板&#xff0c;那么有没有想过&#xff0c;我们天天都在使用的它&#xff0c;它的底层又是怎么样的&#xff0c;它又是如何实现的呢。这里讲挑选几个比较常用的一个功能…

SGD原理及Pytorch实现

&#x1f38f;目录 &#x1f388;1 SGD       &#x1f384;1.1 原理       &#x1f384;1.2 构造       &#x1f384;1.3 参数详解——momentum ✨1 SGD &#x1f95a;2.1 原理 SGD为随机梯度下降&#xff0c;原理可看刘建平老师博客。 &#x1f383;…

Blender--原理化体积

“原理化体积 着色器将所有体积着色组件组合到一个易于使用的节点中。该节点含有散射&#xff0c;吸收和黑体辐射属性&#xff0c;因此&#xff0c;可以仅仅使用该着色器节点对烟雾和火焰等进行渲染。” 官方文档介绍&#xff1a;原理化体积 — Blender Manual 可以用于实现丁…