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

事务在整个开发框架中是一个非常常用的功能,特别涉及到数据库操作。像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注解,并且手动抛出异常

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

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

    @Testvoid 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.rhkb.cn/news/137000.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下C++的反射功能

概述 c/c如果在日志中查看某个结构体/类的每个变量名,变量值信息,只能通过printf逐个格式化,非常繁琐,如何做到类似protobuff转json的序列化功能呢?该dll库先通过分析pdb文件获取结构体/类的变量名称、变量地址&#…

某计费管理系统任意文件读取漏洞

文章目录 声明一、漏洞描述二、漏洞复现声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、漏洞描述 蓝海…

使用JQ获取并渲染三级联动分类数据

数据JSON格式 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…

普中51-矩阵按键

矩阵按键 原理图如下&#xff1a; 行列扫描 行列扫描法检测时&#xff0c;先送一列为低电平&#xff0c;其余几列全为高电平(此时我们确 定了列数)&#xff0c;然后立即轮流检测一次各行是否有低电平&#xff0c;若检测到某一行为低电 平(这时我们又确定了行数)&#xff0c;…

卓越领先!安全狗入选2023年福建省互联网综合实力50强

近日&#xff0c;福建省互联网协会在2023年东南科技论坛——智能算力助力数字经济产业融合发展论坛上正式发布2023年福建省互联网综合实力前50家企业最终评定结果。 作为国内云原生安全领导厂商&#xff0c;安全狗凭借突出的竞争力和市场表现入选综合实力50强。 厦门服云信息科…

Cesium 空间量算——高度量算

高度量算 需求分析 需求 测量两个点之间的高度 分析 直线,水平,垂直测量我们也叫高度的测量,大概原理就是空间两点垂直与地面画一个直角三角形,分别标出每条线的长度 // 添加标签 addLabel(centerPosition, text) {return this.viewer.entities.add(new Cesium.Entity({pos…

创邻科技,位居IDC MarketScape中国图数据库市场领导者类别

图数据库&#xff0c;正进入市场发展的新阶段。 随着中国经济社会数字化转型加速&#xff0c;数据成为新型生产要素。如何存储并管理海量数据&#xff0c;挖掘数据价值&#xff0c;打破原有增长天花板&#xff0c;成为企业重塑商业价值的关键。存量经济时代更需要深层关系挖掘&…

npm、yarn、pnpm如何清除缓存?

前端工程化创建项目会经常使用各种安装包管理工具&#xff0c;安装各种前端依赖包。例如&#xff0c;npm、yarn、pnpm等。时间一长&#xff0c;各种安装包管理工具的在安装依赖时&#xff0c;留下的缓存文件就会变得很大&#xff0c;以至于影响系统的运行&#xff0c;因此必要时…

6- 华为云查看容器日志

1 查看位置 二 进入容器查看 ls cat main.py # 退出命令是 exit() 或者 quit() cat main.py 在docker使用该命令进入文件后的退出命令

反转了,被嘲讽的苹果“假5G”,却是全球主流5G技术

苹果的5G信号被指造假&#xff0c;而一些业内人士指出苹果的信号显示符合3GPP的要求&#xff0c;面对专业人士的质疑&#xff0c;某项姓专家继续辩解&#xff0c;指5G NSA为假5G&#xff0c;然而笔者查找了全球运营商的5G网络建设却发现5G NSA竟然是主流的5G技术。 其实5G NSA与…

《定位》杂志专访丨中南大学杨泽发:InSAR是大范围矿山边坡监测利器

杨泽发 中南大学地球科学与信息物理学院教授 近日&#xff0c;为有效防范遏制矿山重特大事故发生&#xff0c;国家矿山安全监察局发布了《关于开展露天矿山边坡监测系统建设及联网工作的通知》&#xff0c;对矿山边坡监测建设作了“硬性规定”&#xff08;点击蓝字详细了解&…

【面试必刷TOP101】链表相加 单链表的排序

目录 题目&#xff1a;链表相加(二)_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;单链表的排序_牛客题霸_牛客网 (nowcoder.com) 题目的接口&#xff1a;…

学Python的漫画漫步进阶 -- 第十四步.网络通信

学Python的漫画漫步进阶 -- 第十四步.网络通信 十四、网络通信14.1 基本的网络知识14.1.1 TCP/IP14.1.2 IP地址14.1.3 端口14.1.4 HTTP/HTTPS 14.2 搭建自己的Web服务器14.3 urllib.request模块14.3.1 发送GET请求14.3.2 发送POST请求 14.4 JSON数据14.4.1 JSON文档的结构14.4.…

arcgis拓扑检查实现多个矢量数据之间消除重叠区域

目录 环境介绍&#xff1a; 操作任务&#xff1a; 步骤&#xff1a; 1、数据库和文件结构准备 2、建立拓扑规则 3、一直下一页默认参数后&#xff0c;进行拓扑检查 4、打开TP_CK_Topology&#xff0c;会自动带出拓扑要素&#xff0c;红色区域为拓扑错误的地方&#xff1…

【HarmonyOS】元服务卡片router实现跳转到指定页面

【关键字】 元服务卡片、router跳转不同页面 【写在前面】 本篇文章主要介绍开发元服务卡片时&#xff0c;如何实现从卡片中点击事件跳转到指定的应用内页面功能。此处以JS UI开发服务卡片为例&#xff0c;JS卡片支持组件设置action&#xff0c;包括router事件和message事件&…

windows常见的命令行操作

1.查看网络 ipconfig 2.根据任务id关闭进程 1.模糊搜索服务 tasklist | findstr QQ 2.根据模糊搜索结果&#xff0c;获取对应的pid taskkill /F /PID 5128 其他常见命令 若不清楚参数&#xff0c;使用&#xff08;命令 /?&#xff09;即可查看help

Java 华为真题-猴子爬山

需求&#xff1a; 一天一只顽猴想去从山脚爬到山顶&#xff0c;途中经过一个有个N个台阶的阶梯&#xff0c;但是这猴子有一个习惯&#xff1a;每一次只能跳1步或跳3步&#xff0c;试问猴子通过这个阶梯有多少种不同的跳跃方式&#xff1f; 输入描述 输入只有一个整数N&#xff…

Digger PRO - Voxel enhanced terrains

资源链接在文末 Digger PRO​​​ 是一个简单但强大的工具,可以直接从 Unity 编辑器或游戏中创建天然洞穴和悬岩。会让你感觉自己手中握有一个体素地形,且毫无瑕疵。它实际上保持着最新、最快且可靠的 Unity 地形系统,并在你需要的地方无缝创建洞穴/悬岩峭壁网格。Digger 内…

Vue3项目中使用插槽

前言&#xff1a; 此文章仅记录插槽的使用&#xff0c;用于自己后期学习查看。 代码实现过程中&#xff0c;HelloWorld为子组件&#xff0c;HomeView为父组件 <slot></slot>元素&#xff1a; 是一个插槽出口&#xff0c;是写在子组件中的&#xff0c;表示了父组件…

ORM框架的发展历史

文章目录 JDBCJDBC操作的特点JDBC优化1.0JDBC优化2.0JDBC优化3.0 Apache DBUtils初始配置基本操作 SpringJDBC初始配置CRUD操作 HibernateORM介绍Hibernate的使用创建项目配置文件CRUD 操作其他方式 Hibernate总结 MyBatis JDBC JDBC操作的特点 最初的时候是直接通过jdbc来直…