SpringBoot中级开发--事务配置管理(10)

news2024/11/25 21:39:31

事务在整个开发框架中是一个非常常用的功能,特别涉及到数据库操作。像Mysql,就有4个数据库级别:

(1) READ UNCOMMITTED(读未提交):允许读取未提交的数据。这种级别的事务可以读取到其他事务未提交的数据,可能会导致脏读、不可重复读和幻读等问题。

(2)READ COMMITTED(读已提交):只能读取已经提交的数据。这种级别的事务可以避免脏读,但可能会出现不可重复读和幻读等问题。

(3)REPEATABLE READ(可重复读):保证在同一个事务中多次读取同一份数据时,得到的结果是一致的。这种级别的事务可以避免脏读和不可重复读,但可能会出现幻读等问题。

(4)SERIALIZABLE(串行化):强制事务串行执行,避免了所有并发问题。这种级别的事务可以避免所有并发问题,但可能会导致性能问题。

事务级别从低到高,性能越来越差。通过不同的应用场景,选择不同的事务。
(1) READ UNCOMMITTED(读未提交):对数据一致性要求不高的,比如 统计分析

(2)READ COMMITTED(读已提交):对数据一致性要求较高,比如,金融计费系统

(3)REPEATABLE READ(可重复读):对数据一致性要求非常高,比如银行

(4)SERIALIZABLE(串行化):对数据一致性要求最高,这个也是银行应用比较多

接下来我们介绍,脏读,不可重复读,幻像读,第一类更新丢失,第二类更新丢失

脏读

时间序转账事务甲取款事务乙
1开始事务
2开始事务
3查询到账户有100元
4取出50,余额修改为50元
5查询到余额为50元
6撤销事务,余额改回100元
7存入10元,余额为60元
8事务提交

发生在第5步的就是脏读,由于甲读到乙未有提交的数据,造成脏读,后面乙又撤回了事务,把本该取的50元退了回去,但是甲由于读到了脏数据,并且根据脏数据存入了10元,这样就造成了账户白白丢失了50元。

不可重复读

时间序取款事务甲转账事务乙
1开始事务
2开始事务
3查询到账户有100元
4查询到账户有100元
5取出10元,余额为90元
6提交事务
7查询余额为90元,与第4步的不一致

在同一个事务中,4,7时间序读出的余额都不一样。

幻像读

时间序统计事务甲转账事务乙
1开始事务
2开始事务
3统计总账户有100元
4现在增加一个账户,存入10元
5提交事务
6再次统计是110元

3,6查询出来的数据金额不一致。这样就出现了幻像读。幻像读和不可重复读感觉上好像一样,但是不可重复读是由于数据的更新造成的,要避免的话,直接加上行锁就可以。但是幻像读是由于数据新增造成的,对于这种问题,需要加上表锁。

第一类更新丢失

时间序取款事务甲转账事务乙
1开始事务
2开始事务
3查询到账户有100元
4查询到账户有100元
5汇入10元,余额为110元
6事务提交
7取出10元,把余额设为90元
8事务撤销
9余额恢复为100元(丢失更新)

甲在撤销事务的时候,把乙存入的10元给抹掉了。

第二类更新丢失

时间序转账事务甲取款事务乙
1开始事务
2开始事务
3查询到账户有100元
4查询到账户有100元
5取出10元,余额为90元
6事务提交
7存入10元
8事务提交
9把余额设为110元(丢失更新)

转账事务甲把取款业务乙的提交事务更新了,这样造成银行可能损失了10元。

Mysql的4个事务隔离级别能处理的业务并发

隔离级别脏读不可重复读幻象读第一类丢失更新第二类丢失更新
READ UNCOMMITTEDyesyesyesnoyes
READ COMMITTEDnoyesyesnoyes
REPEATABLE READnonoyesnono
SERIALIZABLEnonononono

在Springboot中,我们先引入事务依赖包,加入了mybatis这个依赖后,springboot就已经自动注入了DataSourceTransactionManager,这样就可以直接使用@Transactional 注解进行事务使用,Transactional 既可以注解在方法上,也可以注解在类上,注解在类上代表该类的public方法都开启事务的,如果类和方法都开启了Transactional ,类级别的注解会重载方法级的注解。
在这里插入图片描述
我们紧接上一篇的代码,在DAO层增加insert 代码

    @Insert("insert into welcome_info(info) values('transaction test')")
    @DS("test")
    public void  insertintoWelcomeinfo();

在Service层增加@Transactional注解,并且手动抛出异常

  @Transactional
    public void insertWelcomeInfo(){
        //插入一条记录
        welcomDao.insertintoWelcomeinfo();
        //手动抛出异常
        throw new RuntimeException();
    }

在Test用例代码中,增加测试用例方法,来测试上面的Service方法,看数据是否会回滚

    @Test
    void testTransactional(){
        welcomeService.insertWelcomeInfo();
    }

运行之后,会直接抛出异常,数据库并没有增加记录,这样异常就生效了。
在这里插入图片描述
现在如果我们注释掉throw new RuntimeException();这行代码,那么记录就会插入数据库。
在这里插入图片描述
有时候有些异常没有被捕获到,而造成事务没有回滚,这是由于Springboot的默认事务是遇到RuntimeException和程序错误Error造成事务回滚。如果要捕获这些通用的异常,只要在注解中增加rollbackfor选项。比如: @Transactional(rollbackFor = Exception.class)

我们来认识一下Transactional注解的主要配置选项

属性值具体意义
propagationtiong主要定义事务周期
isolation设置事务隔离级别
timeout指定事务过期时间,默认为数据库事务过期时间
readonly指定事务是否是只读事务
rollbackFor指定哪些异常可以引起事务回滚
noRollbackFor指定哪些异常不引起事务回滚

propagationtiong选项:

REQUIRED,方法A调用时没有事务就新建,当调用另一个方法B时,方法B将使用与A相同的事务,如果B发生异常,这个事务都回滚回去。

REQUIRES_NEW,方法A和B,在方法调用的时候无论是否有开启一个新事务,如方法B有异常不会导致方法A的数据回滚。

NESTED 和上面的类似,但支持JDBC,不支持JPA或Hibernate

SUPPORT 方法调用时有事物就用事务,没事务就不用事务

NOT SUPPORT 强制不在事务中执行,在方法调用到结束阶段事务都会被挂起

NEVER 强制方法不在事务中执行,若有事务抛出异常

MANDATORY 强制方法在事务中,没有事务就抛出异常

Isolation选项

READ UNCOMMITTED

READ COMMITTED

REPEATABLE_READ

SERIALIZABLE

DEFAULT 使用数据库的默认是隔离级别,ORACLE,SQL SERVER是READ COMMITTED ,Mysql是REPEATABLE_READ

程序的源码在这里可以下载到链接:链接: https://pan.baidu.com/s/1jL04s4huVnTBOaQyg68QIA 提取码: vgut

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

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

相关文章

docker部署最新版nacos(2.2.3)设置登录密码

最新版nacos(2.2.3)安装 1、下载 docker pull nacos/nacos-server2、启动nacos 如果nacos版本在2.0及以上,需要把8848、9848和9849三个端口映射出来,否则访问会404失败 docker run --env MODEstandalone --name nacos -d -p 8…

echarts统一纵坐标y轴的刻度线,刻度线对齐。

要求: 纵坐标刻度线对齐;刻度间隔为5;去掉千位默认的逗号;刻度最小是0. 效果图: 代码: yAxis: [{type: "value",position: "left",name: "kW",offset: 100,nameTextStyle:…

Android使用glide时报错“ ����: �޷�����Fragment Glide.with(getContext()) ^ �Ҳ���and”

在gradle.properties中添加下面两行代码 即可 android.useAndroidXtrue android.enableJetifiertrue

计算机界最著名的两个“小偷”,最后都成了亿万富豪!

1983年11年,乔布斯接到“线报”:亲密的合作伙伴比尔盖竟然违反合作协议,发布了一个新产品:Windows ! 他勃然大怒,立刻让手下把盖茨叫来,对着盖茨怒吼:你骗了我们,我那么信…

Vue基础语法【上】

目录 前言 一、插值 1.文本插值 2.html解析 3.属性 4.表达式 5.截取 6.三元运算符 二、指令 1.v-if 2.v-for 3.v-bind 4.v-on 5.v-if|v-else|v-else-if 6.自定义指令 三、过滤器 1.局部过滤 2.全局过滤 四、计算属性与监听属性 1.计算属性 2.监听属性 五、…

【计算机毕业设计】基于协同过滤算法的体育商品推荐系统的设计与实现、SpringBoot+Vue

博主主页:一季春秋博主简介:专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

【Java】第一个Servlet程序

第一个Servlet程序 创建项目引入依赖手动创建必要的目录/文件编写代码打包程序部署验证程序是否正常工作 创建项目 选中maven 创建好项目后,观察左侧项目结构 引入依赖 当权代码需要使用servlet开发,而Java标准库中并没有servlet,此时就需要让maven能够把servlet的依赖获取…

启动YOLO进行图片物体识别

查看官方文档YOLO: Real-Time Object Detection 这些是一些模型的对比,显示了YOLO的优势,继续往下面看 CoCoData set 是一个数据库,用来训练模型,这里面有丰富的物体检测,分割数据集,图像经过了精确的segm…

大数定理:期望损失与经验损失的依据

在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。通俗地说,这个定理就是,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。偶然中包含着某种必然。 大数定律(l…

为实验室运维提供安全、智能、节能整体解决方案的易云维®实验室智能化管理平台

实验室安全问题频繁发生,在对生命损失表示遗憾的同时,再次提醒科研人员,实验室安全不容忽视。为了保证实验室工作环境的安全,易云维自主研发了实验室智能化管理平台,其中安防管理功能对确保实验室安全具有重大意义。 实…

关于浏览器的周边知识 01(副本)

先说两个概念,互联网 internet 泛指具有互通的计算机网络;因特网 Internet 是基于TCP/IP 协议族的最大的计算机网络;万维网 web (word wide web) 是基于互联网,由超链接和统一资源标识符(连接)的文件和其他…

GE WES13-3控制主板模块

GE WES13-3 控制主板模块通常是工业自动化和控制系统中的关键组件,用于控制和监测各种设备和过程。以下是可能包括在该模块中的一些产品功能: 控制处理器:WES13-3 控制主板模块通常配备控制处理器,用于执行控制逻辑和算法&#xf…

如何打造可视化警务巡防通信解决方案

近年来,科学技术飞速发展,给予了犯罪分子可乘之机。当面临专业化的犯罪分子、高科技的犯罪手段,传统警务模式似乎不能满足警方打击犯罪的需要,因此当今公安工作迫切需要构建智能化、系统化、信息化的警务通信管理模式。 警务人员…

Hi Mainnet 2023,Moonbeam来啦!

Messari一年一度Mainnet大会今年回归!9月20日-23日,来自加密业界专家们满满三天的演讲干货、社交机会、专题工作坊将给予参会者独一无二的体验。 在参与了9月初韩国区块链周、月中Token2049之后,本周Moonbeam Network也将马不停蹄地参加此次…

文字转语音真人发声怎么弄?3款亲测好用的智能配音软件

现在AI人工智能语音技术已经比较发达了,可能很多朋友会发现影视解说经常遇到耳熟的声音,其实就是AI配音效果,才会这么相似。 今天就给大家分享3个好用的AI配音工具,希望对你有所帮助! 一、:悦音配音 悦音…

Android 中手指从按钮 A 平移到 B,会发生什么?为什么?

作者:TechMerger 前言 Touch 相关问题是 Android 面试中常问的点,不一定要求大家都从 InputFlinger 底层开始回答,但起码需要了解 Touch 抵达 App 之后的完整处理。而即便是这段偏上层的链路,也不要局限在老生常谈的过程复述&…

【Linux旅行记】探究操作系统是如何进行管理的!

文章目录 什么是操作系统?操作系统概念操作系统的目的底层硬件驱动程序操作系统理解系统调用接口 操作系统是如何进行管理的?什么是管理?操作系统是如何管理硬件信息呢? 🍀小结🍀 🎉博客主页&am…

权威认可!麒麟信安实力入选中国信通院 2023《高质量数字化转型产品及服务全景图》

日前,中国信息通信研究院(简称“中国信通院”)发布2023《高质量数字化转型产品及服务全景图(8月份新增入图产品)》,麒麟信安实力入选,成为云服务领域的标杆企业。 麒麟信安入选2023 《高质量数字…

激光焊如何更准更稳?维视智造激光焊视觉解决方案助力精密制造

激光焊接是一种高能密度、非接触的焊接技术,它利用激光束对工件进行加热和熔化,然后使其在熔池的情况下形成连接。与传统的焊接方法相比,激光焊具有高密度、熔深小、变形小、焊缝质量高、适用性广、自动化程度高等特点,可以实现焊…

【C语言】自定义类型:结构体【结构体内存具详细】,枚举,联合

目录 一、结构体 1.结构的声明 2.特殊的声明 3.结构的自引用 4.结构体变量的定义和初始化 5.结构体内存对齐(重点来了) 6.为什么会存在内存对齐 7.修改默认对齐数 8.结构体传参 二、位段 1.什么是位段 2.位段的内存分配 3.位段的跨平台问题…