数据库——事务,事务隔离级别

news2025/1/10 21:23:38

文章目录

      • 什么是事务?
      • 事务的特性(ACID)
      • 并发事务带来的问题
      • 事务隔离级别
      • 实际情况演示
        • 脏读(读未提交)
        • 避免脏读(读已提交)
        • 不可重复读
        • 可重复读
        • 防止幻读(可串行化)

什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。

事务的特性(ACID)

在这里插入图片描述

  1. 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  2. 一致性: 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
  3. 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

并发事务带来的问题

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。

  • 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
  • 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
  • 不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
  • 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

不可重复度和幻读区别:

不可重复读的重点是修改,幻读的重点在于新增或者删除。

例1(同样的条件, 你读取过的数据, 再次读取出来发现值不一样了 ):事务1中的A先生读取自己的工资为 1000的操作还没完成,事务2中的B先生就修改了A的工资为2000,导 致A再读自己的工资时工资变为 2000;这就是不可重复读。

例2(同样的条件, 第1次和第2次读出来的记录数不一样 ):假某工资单表中工资大于3000的有4人,事务1读取了所有工资大于3000的人,共查到4条记录,这时事务2 又插入了一条工资大于3000的记录,事务1再次读取时查到的记录就变为了5条,这样就导致了幻读。

事务隔离级别

SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读

隔离级别脏读不可重复读幻影读
READ-UNCOMMITTED
READ-COMMITTED×
REPEATABLE-READ××
SERIALIZABLE×××

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看,MySQL 8.0 该命令改为SELECT @@transaction_isolation;

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

这里需要注意的是:与 SQL 标准不同的地方在于InnoDB 存储引擎在 REPEATABLE-READ(可重读) 事务隔离级别下,允许应用使用 Next-Key Lock 锁算法来避免幻读的产生。这与其他数据库系统(如 SQL Server)是不同的。所以说虽然 InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) ,但是可以通过应用加锁读(例如 select * from table for update 语句)来保证不会产生幻读,而这个加锁度使用到的机制就是 Next-Key Lock 锁算法。从而达到了 SQL 标准的 SERIALIZABLE(可串行化) 隔离级别。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取提交内容):,但是你要知道的是InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读) 并不会有任何性能损失。

InnoDB 存储引擎在 分布式事务 的情况下一般会用到SERIALIZABLE(可串行化) 隔离级别。

实际情况演示

在下面我会使用 2 个命令行mysql ,模拟多线程(多事务)对同一份数据的脏读问题。

MySQL 命令行的默认配置中事务都是自动提交的,即执行SQL语句后就会马上执行 COMMIT 操作。如果要显式地开启一个事务需要使用命令:START TARNSACTION

我们可以通过下面的命令来设置隔离级别。

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

我们再来看一下我们在下面实际操作中使用到的一些并发控制语句:

  • START TARNSACTION |BEGIN:显式地开启一个事务。
  • COMMIT:提交事务,使得对数据库做的所有修改成为永久性。
  • ROLLBACK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

脏读(读未提交)

在这里插入图片描述

避免脏读(读已提交)

在这里插入图片描述

不可重复读

还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题。

在这里插入图片描述

可重复读

在这里插入图片描述

防止幻读(可串行化)

在这里插入图片描述

一个事务对数据库进行操作,这种操作的范围是数据库的全部行,然后第二个事务也在对这个数据库操作,这种操作可以是插入一行记录或删除一行记录,那么第一个是事务就会觉得自己出现了幻觉,怎么还有没有处理的记录呢? 或者 怎么多处理了一行记录呢?

幻读和不可重复读有些相似之处 ,但是不可重复读的重点是修改,幻读的重点在于新增或者删除。

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

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

相关文章

DNQ算法原理(Deep Q Network)

1.强化学习概念 学习系统没有像很多其它形式的机器学习方法一样被告知应该做出什么行为 必须在尝试了之后才能发现哪些行为会导致奖励的最大化 当前的行为可能不仅仅会影响即时奖励,还会影响下一步的奖励以及后续的所有奖励 每一个动作(action)都能影响代理将来的…

Java中Date日期类的使用方法

一、构造器实例化对象 //使用无参构造器 Date date1 new Date(); System.out.println(date1);//使用有参构造器,参数为long类型的时间戳,将时间戳自动转为时间对象 Date date2 new Date(60000); System.out.println(date2); 运行结果: 说…

直击软博会|润和软件国产操作系统HopeStage助力行业数字化实践

2023年8月22日下午,2023中国(南京)软博会信息技术应用创新大会在南京国际博览会议中心顺利召开,润和软件作为信创操作系统领域的核心力量受邀参会并发表演讲。 会上,润和软件云计算事业部总经理蔡志旻发表了《HopeStag…

电压放大器有什么特点和作用

电压放大器是一种常见的电子设备,具有许多特点和作用。下面安泰电子来详细介绍电压放大器的特点和作用。 电压放大器具有以下几个特点: 增益高:电压放大器能够将输入信号的电压放大到较高的水平。这意味着它可以增加信号的强度,使…

身份证号、姓名脱敏(*隐藏关键信息)

// 过滤器 filters: {// 加密身份证明号码encryptSfzmhmHandler(val) {// 加密年月日return val ? val.replace(val.slice(6, -4), ********) : }// 加密姓名encryptXmHandler(val) {let value if (val && val.length 2) {// 两个字的*最后一个字value val.replace…

数据管道的重要性:为什么您需要关注!

一、引言 在当今的信息时代,数据已经成为了企业的生命线。无论是商业决策,还是产品研发,都离不开对数据的依赖。然而,如何有效地管理和使用这些数据,却是许多企业面临的难题。这时,数据管道的重要性就显现出…

四川玖璨电子商务有限公司:短视频运营的关键

​短视频运营作为当前互联网行业的热点之一,具有广阔的发展前景。然而,要在激烈的竞争中脱颖而出,就需要掌握一些关键点。下面将从内容创作、用户增长、社交互动和商业变现等几个方面来探讨短视频运营的关键。 一、内容创作。 内容是短视频…

【leetcode 力扣刷题】交换链表中的节点

24. 两两交换链表中的节点 24. 两两交换链表中的节点两两节点分组,反转两个节点连接递归求解 24. 两两交换链表中的节点 题目链接:24. 两两交换链表中的节点 题目内容: 题目中强调不能修改节点内部值,是因为如果不加这个限制的话…

跨境电商shopee平台怎么样?Shopee选品工具是什么?

跨境电商shopee平台市场可以说是相当活跃和竞争激烈的电商市场。作为东南亚地区最大的电商平台之一,跨境电商shopee平台覆盖了多个国家和地区,包括新加坡、马来西亚、泰国、印度尼西亚、越南、菲律宾和台湾。 跨境电商shopee平台市场的活跃程度体现在以下…

广州华锐互动:3D航天科学网上展馆让你沉浸式体验航天文化

3D航天科学网上展馆是一种利用先进的3D技术和虚拟现实技术展示航天科技的场所。与传统的展馆相比,3D航天科学网上展馆具有许多独特的特色。以下是3D航天科学网上展馆的一些主要特色: 1.沉浸式体验:3D航天科学网上展馆通过虚拟现实技术为观众提…

Windows10查看图片的分辨率

文章目录 查看方法 查看方法 鼠标悬停在想查看分辨率大小的图片上,稍等那么零点几秒,就会弹出图片的分辨率信息,如图所示:

单片机系统的电磁兼容设计

目录 1.什么是单片机 2.单片机的应用领域 3.单片机系统常见的电磁干扰 4.电磁干扰对单片机造成的影响 5.如何消除单片机系统的电磁干扰 1.什么是单片机 单片机是一种集成电路芯片,也被称为微控制器。它集成了中央处理器(CPU)、存储器、输…

湘潭大学 湘大 XTU OJ 1441 平衡三进制2 题解(非常详细)

前置知识 很多时候我们觉得一件事情难,其实并不是这一整件事情难,而是中间有一部分(极端情况是几乎所有)东西我们不知道,没有相关的经验,所以我们不断地学习 这道题目的前置知识是十进制转三进制怎么转换…

朋友圈发圈文案防折叠不折叠转换流量主小程序开发

朋友圈发圈文案防折叠不折叠转换流量主小程序开发 不折叠:转发此条动态,帮我解锁朋友圈新技能,让你的朋友圈更加精彩!折叠转不折叠:转发此动态,即可开启朋友圈折叠转不折叠的功能,让你的朋友圈…

第七章 类、结构体、指针与引用

目录 1.基础知识2.练习题2.1 斐波那契数列2.2 替换空格2.3 求12…n2.3.1 方法一:2.3.2 方法二: 2.4 在O(1)时间删除链表结点2.5 合并两个排序的链表2.6 左旋转字符串2.7 把字符串转换成整数2.8 反转链表2.9 两个链表的第一个公共结点2.10 删除链表中重复…

错误代码0xc0000225要怎么解决?一招教你快速搞定

在运行 Windows 10 操作系统时,您可能会遇到一个错误代码为 0xc0000225 的问题,导致无法正常启动系统。这个错误通常与系统引导文件或硬盘驱动器有关。在本文中,我们将详细介绍多种解决方法来解决 0xc0000225 错误,以帮助您重新恢…

如何选择图像标注工具?

图像标注属于数据标注的一种类型。也许数据标注是人工智能领域不为人知的工作,但也是取得人工智能项目的成功不可或缺的一个环节。数据标注平凡而不平庸,标注的数据质量将直接影响模型的质量。选择恰当高效的标注工具也决定着数据的产出质量。 图像标注作…

AI 绘画Stable Diffusion 研究(十四)SD 图生图+剪映制作人物说话视频

大家好,我是风雨无阻。 前一篇,我们详细介绍了使用 SadTlaker制作数字人视频案例,感兴趣的朋友请前往查看:AI 绘画Stable Diffusion 研究(十三)SD数字人制作工具SadTlaker使用教程。 对于没有安装 SadTlaker 插件的朋友…

AST+chatGPT降维系列|某cookie反爬之acw_sc__v2分析

关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除! 1. 目标网站 aHR0cHM6Ly93d3cuY2R0LWVjLmNvbS9ob21lL21vcmUtenlnZy5od…

【升职加薪秘籍】我在服务监控方面的实践(8)-elasticsearch 性能监控与分析手段

大家好,我是蓝胖子,之前讲了mysql,redis中间件的监控,今天我们再来看看另一个基础组件elasticsearch,如何对它进行监控,当你思考如何对一个组件进行监控时,四大黄金指标会告诉你答案&#xff0c…