【Spring/MySQL数据库系列】数据库事务的特点与隔离级别

news2024/10/5 20:28:22

⭐️前面的话⭐️

本文已经收录到《Spring框架全家桶系列》专栏,本文将介绍有关数据库事务的特点以及隔离级别。

📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2023年5月20日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《无》
💬参考在线编程网站:🌐牛客网🌐力扣🌐acwing
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


📌导航小助手📌

  • 1.事务的基本特性
    • 1.1事务的概念
    • 1.2事务的使用
  • 2.数据库的隔离级别
    • 2.1并发操作的时候的问题
      • 2.1.1脏读
      • 2.1.2不可重复读
      • 2.1.3幻读
      • 2.1.4丢失更新
    • 2.2事务的隔离级别
      • 2.2.1读未提交
      • 2.2.2读已提交
      • 2.2.3可重复读
      • 2.2.4串行化执行
      • 2.2.5总结


封面


1.事务的基本特性

1.1事务的概念

事务诞生的目的就是将多个独立的操作视作一个整体,要么全部执行,要么全部不执行。

事务的四大特性:ACID

  • 原子性:对于一个事务中的所有操作要么全部执行,要不都不执行。事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须回滚,数据库状态应该退回到执行事务前的状态。
  • 一致性:事务执行之前与执行之后都是合理合法的,例如转账,转账支出与转账收入应该相当。
  • 持久性:事务提交之后,数据写入硬盘,无论你重启程序还是关机,数据依然存在。
  • 隔离性:隔离性描述的是并发执行的时候,出现的情况。

并发执行事务带来的问题:

1.2事务的使用

第一步,开启事务

start transaction;

第二步,执行多条sql语句

# 若干条sql语句

第三步,提交或回滚事务
如果想要完成事务的提交使用commit,想要完成事务的回滚使用rollback

commit/rollback;

2.数据库的隔离级别

2.1并发操作的时候的问题

2.1.1脏读

脏读指的是事务A读到了另外一个事务B未提交的数据,如果事务B发生了回滚,就会造成事务A获取到的数据是脏数据,这就是脏读。

下面来举一个例子说明,账户余额一开始为800,事务A表示有人转入了100元到账户,事务B表示转出300元但失败了,最终账户余额为900才是合理的,但是如果事务A读取到事务B未提交的数据,就会发生错误,这就是脏读可能会造成的危害。

1

事务A表示转入100元,但是事务B转出操作失败了,但事务A读取到了事务B未提交的数据,导致最终账户余额多扣了300元,事务A读取到事务B未提交的数据,这就是脏读。

2.1.2不可重复读

不可重复读其实和脏读有一点像,脏读读到的是另外一个事务未提交的数据,不可重复读,它读到的是另外一个事务已经提交的数据,造成读取的值不一致的情况。

展开来说就是,事务A读取了某一数据,然后事务B将该数据修改并提交了,事务A再次又读了该数据,但是得到的结果与上一次结果不同,这种现象就是不可重复读。

举个例子,一开始账户余额为500,事务A读取余额为500,然后事务B将钱转出了300元,余额变为200,事务A再次查询余额得到200元,在同一事务中,由于读取到另外一个事务提交的数据发生与第一次数据读取不一致的情况即不可重复读现象。

2

事务A首先查询到账户余额为500元,然后事务B转出余额300元,导致余额变为200元,事务A再一次查询,得到的查询结果发生了变化,变成200元了,这种读取相同数据不一致的现像,就是不可重复读。

2.1.3幻读

幻读即事务A第一次查询到数据表中符合要求的结果有n条,然后事务B插入了若干条数据,最后事务A再次同一调条件进行查询,符合要求的结果为m条,同一事务中,多次查询到合法数据结果不一致的现象就是幻读现象。

举个例子,一开始在用户表中事务A查询到了有3个名叫张三的人,然后事务B向数据库注册了一批新用户,事务A又查询了名叫张三的人,发现查询结果有6条,这就是幻读现象。
3

事务A首先查询张三有3人,然后事务A执行其他业务的时候,事务B注册了一批新用户,最后事务A再次查询张三的时候,出现了6人,这种在同一事务同样条件查询结果不一致的情况,即幻读。

2.1.4丢失更新

当两个或多个事务操作同一个数据表的时候,可能会发生一个事务没有感应到另外一个事务的更新操作,二造成更新出现错误的现象。

4
两个事务均进行更新操作,相互影响,某一事务撤销影响最终结果的准确性。

5
事务B覆盖了事务A的更新,影响最终结果的准确性。

这几种情况在并发的条件下都有可能造成不利后果,如脏读会导致转账的数目不对,不可重复读和幻读都可能会造成最终统计的结果不可靠,第一,二类更新丢失都会造成账户余额更新出现致命错误。

2.2事务的隔离级别

数据库并发访问所产生的问题,在有些场景下可能是允许的,但是有些场景下可能是致命的,数据库通常会通过锁机制来解决数据并发访问问题,按锁对象不同分为表级锁和行级锁;按并发事务锁定关系分为共享锁和独占锁。直接使用锁非常麻烦,为此数据库为用户提供了自动锁机制,用户指定会话的事务隔离级别,数据库就会通过分析SQL语句然后为事务访问的资源加上合适的锁,此外,数据库还会维护这些锁通过各种手段提高系统的性能,这些对用户来讲都是透明的。

简单说,鱼和熊掌不可兼得,速度和可靠性总得有牺牲,为了解决并发时,因地制宜,数据库设置了不同的几种隔离级别,让程序员自己根据实际情况选择一个最佳的事务隔离级别。

数据库事务隔离级别一共有四种,读未提交,读已提交,可重复读,串行化执行,并发程度依次降低,最后一种其实就没有了并发的特性了,但是串行化执行确实是最安全可靠的。

事务的隔离级别如下:

  • 读已提交 READ_COMMITTED
  • 读未提交 READ_UNCOMMITTED
  • 可重复读 REPEATABLE_READ
  • 串行化 SERIALIZABLE
  • 默认值 DEFAULT: (MySQL: 可重复读、Oracle: 读已提交)

2.2.1读未提交

读已提交( READ_UNCOMMITTED)指的是一个事务能够读取到另外一个事务未提交的数据,脏读,不可重复读,幻读,两类数据丢失更新都有可能发生,但大部分数据库在该事务隔离级别下会使用加锁去避免第一类丢失更新问题。

2.2.2读已提交

读已提交(READ_COMMITTED)指的是一个事务只能等另外一个更新事务提交数据后才能读取数据,保证事务读取的数据一定是已提交的数据,避免了脏读的问题,但是不可重复读和幻读问题依然存在,两类数据丢失更新都有可能发生,但大部分数据库会使用锁机制避免了第一类丢失更新问题。

Oracle等大部分数据库默认隔离级别。

2.2.3可重复读

可重复读(REPEATABLE_READ)指的是一个事务读取某数据时,其他的事务都不能修改该条数据,保证并发时,对于某一行数据,读取到的结果都是一样的,这样就解决了脏读,不可重复读的问题,但由于事务读取数据时,还能插入数据,所以幻读问题依然存在。其实两类数据丢失更新仅仅靠隔离级别的隔离逻辑分析还是会发生,但大部分数据库在可重复读的隔离级别下保证不会发生两类丢失更新的情况。

MySQL默认隔离级别。

2.2.4串行化执行

串行化(SERIALIZABLE)指的是一个事务执行完才能执行另外一个事务,即按照顺序执行,没有并发性,因为效率低,一般不采用该隔离级别。脏读,不可重复读,幻读均不会发生,数据库保证了在该隔离级别下,两种丢失更新不会发生。

四种隔离级别只能解决脏读,不可重复读,幻读三类读取的问题,丢失更新的问题需要靠加锁来解决,仅靠隔离级别是无法解决的。

2.2.5总结

隔离级别和可能发生的现象总结如下:

隔离级别脏读不可重复读幻读第一类丢失更新第二类丢失更新
未提交读允许允许允许不允许允许
读写提交不允许允许允许不允许允许
可重复读不允许不允许允许不允许不允许
串行化不允许不允许不允许不允许不允许

注意:事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低。所以应该根据实际情况选择事务的隔离级别。


觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!

1-99

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

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

相关文章

数值计算 - 利用机器计算的基本方式

离散化方法 设f(x)是定义在[a,b]上的连续函数,当它们的表达式很复杂,甚至写不出来时,我们可以选择若干个离散点 求出f(x)在这些点处的函数值或函数值的近似值 从而得到一个如下的函数值列表: ⚠️提示:对于一个实际的…

Android源码环境搭建

Android源码环境搭建 参考: Android源码环境搭建 1.安装Ubuntu16.4 系统 2.openjdk 8 的安装 sudo apt-get install openjdk-8-jdk使用java -version检查版本 3.安装所有的软件包 sudo apt-get install git-core gnupg flex bison gperf build-essential zip c…

Shell基础学习---3、Read读取控制台输入、函数、正则表达式入门

1、Read读取控制台输入 1、基本语法 read (选项) (参数) 选项说明-p指定读取值的提示符-t指定读取值等待的时间(秒) 如果-t不加表示一直等待 参数说明变量指定读取值的变量名 2、案例实操 2、函数 2.1 系统函数 2.1.1 bas…

【数据库】SQLServer报修表,维修表,反馈表三表连查

大家好,我是雷工! 最近参与的一个SCADA项目,客户要求增加设备维保的功能,对设备的报修,维修,反馈过程进行记录查询,进一步提升企业的信息化能力。 该过程的实现是通过创建三个表分别记录报修-维…

uniapp 用css画五边形(app 小程序),长方形中间斜线分割成两部分

效果图 css .scoreLabel{ background: $yxs-theme-color; width: 64rpx; height: 69rpx; line-height: 32rpx; font-size: 28rpx; font-family: DINPro; f…

chatgpt赋能Python-python3_9安装scrapy

Python3.9安装Scrapy——加速数据抓取的利器 在现代数字化时代,数据抓取和数据挖掘的重要性越来越受到重视。作为一种高效的爬虫框架,Scrapy能够实现快速的页面抓取和数据解析,并帮助我们快速获取所需数据。本篇文章将会为大家介绍如何在Pyt…

【零基础学web前端】CSS学习,字体属性,文本属性,背景属性,圆角矩形属性

前言: 大家好,我是良辰丫,在上一篇文章中我们了解了CSS引入方式,CSS基础选择器,CSS复合选择器,今天我们继续学习CSS的相关知识点.💞💞 🧑个人主页:良辰针不戳 📖所属专栏:零基础学web前端 🍎励志…

其利天下技术居于32位MCU推出11万转无刷高速吹风筒方案--【高速吹风筒PCBA】

大家都知道高速吹风筒的兴起是因为戴森的产品体验,从另一角度赋予了吹风筒全新的产品形态和灵魂,于是产品有了智能和品质的体验感。 无刷电机的技术瓶颈在大家的共同努力下,从结构到驱动上都有了新的突破,所以近年来,高…

在疯狂三月之后,深入浅出分析AIGC的核心价值 (下篇)|【AI行研商业价值分析】

Rocky Ding 公众号:WeThinkIn 写在前面 【AI行研&商业价值分析】栏目专注于分享AI行业中最新热点/风口的思考与判断。也欢迎大家提出宝贵的优化建议,一起交流学习💪 大家好,我是Rocky。 本文是《在疯狂三月之后,深…

openwrt-安装NGINX

openwrt-安装NGINX 介绍 OpenWrt 是一个用于嵌入式设备的开源操作系统。它基于 Linux 内核,并且主要被设计用于路由器和网络设备。 OpenWrt 的主要特点包括: 完全可定制:OpenWrt 提供了一个完全可写的文件系统,用户可以自定义设…

目前账号矩阵系统源码有几种框架

目前账号矩阵系统源码主要有三种框架:Spring、Struts和Hibernate。Spring框架是一个全栈式的Java应用程序开发框架,提供了IOC容器、AOP、事务管理等功能。Struts框架是一个MVC架构的Web应用程序框架,用于将数据模型、Web应用程序的用户界面和…

纯css实现手风琴效果

今天在网上看到了一个纯css实现的手风琴&#xff0c;很巧妙 效果如下&#xff1a; 具体代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content…

跨平台应用开发进阶(六十五):小程序分包策略及实战讲解

文章目录 一、前言二、为什么要使用分包&#xff1f;三、分包大小查看四、如何使用分包&#xff1f;五、独立分包六、分包预下载七、项目实战八、拓展阅读 一、前言 微信小程序开发过程中&#xff0c;随着业务不断迭代&#xff0c;程序包的体积越来越大&#xff0c;使用分包加…

HTTP协议报文格式详解和抓包那些事

文章目录 HTTP协议是什么HTTP报文格式抓包工具fiddler HTTP请求请求行HTTP方法URL版本号 请求头HOSTContent-Type&Content-LengthUser-Agent(简称UA)RefererCookie HTTP响应状态行版本号状态码 HTTP协议是什么 HTTP协议全称为超文本传输协议&#xff0c;是一个被广泛使用的…

【dfs之 迭代加深】【dfs层序遍历】【dfs和bfs的缺点结合解决 就是 迭代加深】加成序列

迭代加深 DFS&#xff0c;BFS和迭代加深的联系与区别例题1. 加成序列普通思想&#xff1a;优化方法&#xff1a; DFS&#xff0c;BFS和迭代加深的联系与区别 DFS&#xff1a; DFS算法是沿着搜索树的根节点&#xff0c;一直遍历完该搜索树之后再回溯继续搜索的一种算法。缺点是…

python读取excel数据并用双y轴绘制柱状图和折线图,柱子用渐变颜色填充

python绘图系列文章目录 往期python绘图合集: python绘制简单的折线图 python读取excel中数据并绘制多子图多组图在一张画布上 python绘制带误差棒的柱状图 python绘制多子图并单独显示 python读取excel数据并绘制多y轴图像 python绘制柱状图并美化|不同颜色填充柱子 python随机…

体验css:repeat和grid

文章目录 一、repeat1. 语法2. auto-fill和auto-fit3. 专属尺寸① fr② auto③ max-content④ min-content 二、grid1. 设置grid布局2. 设置列宽行高3. 设置间距4. 设置分区5. 设置布局排列顺序6. 设置单元格内容对齐方式7. 设置整个网格对齐方式8. 设置隐式网格大小9. 设置网格…

geoserver图层样式的多种配置方法

前言&#xff1a;用geoserver发布服务的图层一般都配置了样式&#xff0c;简单的或者复杂的&#xff1b;单一的或者渐进式的等。今天我们结合业务场景、依据具体的数据分析给图层配置样式的多种方式。接着前几篇博客用到的数据为例&#xff1a; 一、配置默认样式 点击此篇文章…

Vue中展示中文名称

我今天调用接口时发现列表展示的楼栋一直是数字&#xff0c;并不是它的中文名称&#xff1b;但是点击编辑获取所属楼栋的下拉框中&#xff0c;又为中文名称&#xff0c;当我选中B栋点击修改之后又变成了B栋对应数字&#xff1b;然后我写了一个根据楼栋id获取对应的中文方法&…

栈与队列的对决:用队列实现栈的2种思路

本篇博客会讲解力扣“225. 用队列实现栈”的解题思路&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是输出示例&#xff1a; 以下是提示和进阶&#xff1a; 这道题有2种思路&#xff0c;分别使用2个和1个队列来实现栈。 准备工作 先来实现队列。由于本篇博客的…