【MySQL】并发事务产生的问题及事务隔离级别

先来复习一下事务的四大特性:

  • 原子性(Atomicity):事务是不可分割的最小操作单位,事务中的所有操作要么全部执行成功,要么全部失败回滚,不能只执行其中一部分操作。
  • 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏,数据总是从一个一致性状态转移到另一个一致性状态。例如,如果一个事务要求将某个账户的金额从 A 转移到 B,那么无论事务是否成功,最终账户 A 和账户 B 的总金额应该保持不变。
  • 隔离性(Isolation):事务之间是相互隔离的,事务可以在不受外部并发操作的影响的独立环境下运行。
  • 持久性(Durability):事务完成后(进行提交或者回滚操作),对数据库的修改将永久保存在数据库中,即使系统故障也不会丢失。因为数据库最终的数据是存储到磁盘上的。

并发事务产生的问题

:通俗一点就是两个事务在操作同一个数据库或者是同一张表时所引发的问题。

大致分为以下三种,脏读,不可重复读,幻读。

问题描述
脏读一个事务读到另一个事务还没提交的数据。
不可重复读  一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
幻读一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现”幻觉“

脏读

上图中事务A内部会执行三次任务(三次完成后事务A才会进行提交操作),事务A先执行了任务1(查询id为1的数据),任务2(修改id为1的数据)。事务A在执行完任务2后,事务B紧接着进行了查询id为1的操作,这时查询的数据是事务A为提交之前的数据,这个数据就是”脏“的,简称脏读。

不可重复读

在事务A第一次进行查询id为1的数据的时候,查询到了结果集1,然后在事务A再次执行查询id为1的数据的之前,事务B对id为1的数据进行了修改,并提交了事务B。这时候事务A再次查询id为1的数据时候就查询出了结果集2,两次结果集不同,这就是不可重复读。

幻读

事务的隔离级别

 查看事务的隔离级别:

mysql> select @@Transaction_isolation;
+-------------------------+
| @@Transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)

设置当前会话的隔离级别:

SET session TRANSACTION ISOLATION LEVEL 隔离级别;

 如果是想在某个事务中设置隔离级别而不想影响别的事务和会话的话可以不用加session:

SET TRANSACTION ISOLATION LEVEL 隔离级别;

 先来看下这组区别。以下就这组区别分别进行对比操作:

 读未提交(read uncommitted)

 读未提交 相比 读已提交 存在脏读问题: 

 脏读演示:

 读已提交(read committed)

 读已提交 相比 可重复读 存在不可重复读问题,但是解决了脏读问题:

解决脏读问题演示:

 不可重复读演示:

可重复读(repeatable-read)(默认)

可重复读 相比 串行化 存在幻读的问题,但是解决了不可重复读的问题:

 解决不可重复读问题展示:

存在幻读:

串行化(serializable)

小结

MySQL 中的事务隔离级别,主要有读未提交、读已提交、可重复度和串行化。这些隔离级别与问题的对应关系如下:

其中,读未提交的性能是最高的,但是安全性和隔离性是最差的,

而串行化则相反,安全性和隔离性最高,但是性能最低。

事务隔离级别脏读不可重复读幻读
读未提交(read uncommitted)
读已提交(read committed)×
可重复读(repeatable-read)(默认)××
串行化(serializable)×××

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

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

相关文章

卷积神经网络的感受野

经典目标检测和最新目标跟踪都用到了RPN(region proposal network),锚框(anchor)是RPN的基础,感受野(receptive field, RF)是anchor的基础。本文介绍感受野及其计算方法,和有效感受野概念。 1.感受野概念 在典型CNN结构中,FC层(…

vue核心面试题汇总【查缺补漏】

给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 很喜欢‘万变不离其宗’这句话,希望在不断的思考和总结中找到Vue中的宗,来解答面试官抛出的…

FPGA设计时序约束七、设置时钟不确定约束

一、背景 在之前的时序分析中,通常是假定时钟是稳定理想的,即设置主时钟周期后按照周期精确的进行边沿跳动。在实际中,时钟是非理想存在较多不确定的影响,存在时延和波形的变化,要准确分析时序也需将其考虑进来&#x…

06 _ 链表(上):如何实现LRU缓存淘汰算法

今天我们来聊聊“链表(Linked list)”这个数据结构。学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是LRU缓存淘汰算法。 缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非常广泛的应用,比如常见的CPU缓存、数据库缓存…

“节省内存、提升性能:享元模式的神奇之处“

概念 享元模式的本质是缓存共享对象,降低内存消耗。 是对象池的的一种实现,一句话用到了缓存了对方和池化技术的地方绝大多是享元模式的体现。 例如线程池,数据库连接池,字符串常量池 应用示例 String中的享元模式 public c…

Linux Centos7安装后,无法查询到IP地址,无ens0,只有lo和ens33的解决方案

文章目录 前言1 查看network-scripts目录2 创建并配置 ifcfg-ens33 文件3 禁用NetworkManager4 重新启动网络服务总结 前言 在VMware中,安装Linux centos7操作系统后,想查询本机的IP地址,执行ifconfig命令 ifconfig结果如下: 结…

​ iOS自动混淆测试处理笔记

1 打开 ipa,导出ipa 路径和配置文件路径会自动填充 ​ 2 点击 开始自动混淆测试处理 自动混淆测试是针对 oc 类和oc方法这两个模块进行自动混淆ipa,并ipa安装到设备中运行,通过检测运行ipa包是否崩溃,来对oc类和oc方法进行筛选。…

Docker Harbor概述及构建

Docker Harbor概述及构建 一、Docker Harbor 概述1.1、harbor 简介1.2、Harbor的优势1.3、Harbor 的核心组件1.4、Docker私有仓库 架构 二、Harbor构建Docker私有仓库2.1 环境配置2.2、部署Harbor服务2.2.1、上传dock-compose,并设置权限2.2.2、安装harbor-offline-…

openEuler 22.03 LTS 环境使用 Docker Compose 一键部署 JumpServer (all-in-one 模式)

环境回顾 上一篇文章中,我们讲解了 openEuler 22.03 LTS 安装 Docker CE 和 Dcoker Compose,部署的软件环境版本分别如下: OS 系统:openEuler 22.03 LTS(openEuler-22.03-LTS-x86_64-dvd.iso)Docker Engine:Docker C…

归并排序(java)

大家好我是苏麟 , 今天说说归并排序 . 归并排序 递归 正式学习归并排序之前,我们得先学习一下递归算法。 定义: 定义方法时,在方法内部调用方法本身,称之为递归. public void show(){System.out.println("aaaa")…

软考高级系统架构师冲关预测

[ – 2023年10月27日 – ] 去年11月通过了软考高级系统架构师的考试,原本想立即分享下过关的总结回顾,但是随着软考新版大纲及教程的发布,也意味着题目及内容的复盘总结经验便不那么适用。在即将迎来今年的软考高架的时候,想着透…

Azure - 机器学习企业级服务概述与介绍

目录 一、什么是 Azure 机器学习?大规模生成业务关键型机器学习模型 二、Azure 机器学习适合哪些人群?三、Azure 机器学习的价值点加快价值实现速度协作并简化 MLOps信心十足地开发负责任地设计 四、端到端机器学习生命周期的支持准备数据生成和训练模型…

k8s statefulSet 学习笔记

文章目录 缩写: stsweb-sts.yaml创建sts扩缩容金丝雀发布OnDelete 删除时更新 缩写: sts 通过 kubectl api-resources 可以查到: NAMESHORTNAMESAPIVERSIONNAMESPACEDKINDstatefulsetsstsapps/v1trueStatefulSet web-sts.yaml apiVersion: v1 kind: Service met…

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器 泰克示波器是经常用到的工具,一般手动操作即可,但有时候也要集成到系统中,需要程控。这时候先要下载厂家提供的例子,了解LabVIEW的demo。根据不用的示波器型号,选择和计…

【SpringCloudNetflix】一图理解Spring Cloud Netflix解决了那些微服务问题?

什么是微服务理解: SpringCloudNetflix解决的问题理解: SpringCloudNetflix核心点: 注册中心:Eureka负载均衡:Ribbon、Feign服务熔断:Hystrix服务降级:Hystrix服务监控:Hystrix Da…

CSS 滚动驱动动画与 @keyframes 新语法

CSS 滚动驱动动画与 keyframes 在 CSS 滚动驱动动画相关的属性出来之后, keyframes 也迎来变化. 以前, keyframes 的值可以是 from, to, 或者百分数. 现在它多了一种属性的值 <timeline-range-name> <percentage> 建议先了解 animation-range 不然你会对 timeli…

高三高考免费试卷真题押题知识点合集

发表于安徽 温馨提示&#xff1a;有需要的真题试卷可联系本人&#xff0c;百卷内上免费资源。 感觉有用的下方三连&#xff0c;谢谢 ​ 。 免费版卷有6-60卷每卷平均4-30页 高三免费高三地理高三英语高三化学高三物理高三语文高三历史高三政治高三数学高三生物 付费版卷有1…

Linux shell编程学习笔记15:定义数组、获取数组元素值和长度

一、 Linux shell 脚本编程中的数组概述 数组是一种常见的数据结构。跟大多数编程语言一样&#xff0c;大多数Linux shell脚本支持数组&#xff0c;但对数组的支持程度各不相同&#xff0c;比如数组的维度&#xff0c;是支持一维数组还是多维数组&#xff1f;再如&#xff0c;…

[Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷

一.Docker 部署 Nginx 以及端口映射 Docker 部署 Nginx,首先需要下载nginx镜像,然后启动这个镜像,就运行了一个nginx的容器了 1.下载 nginx 镜像并启动容器 #查看是否存在nginx镜像:发现没有nginx镜像 [rootlocalhost zph]# docker images | grep nginx#下载nginx镜像 [rootl…

IO流框架,缓冲流

一.缓冲流有什么优点 Java中的缓冲流&#xff08;Buffered Stream&#xff09;具有以下优势&#xff1a; 提高效率&#xff1a;缓冲流通过在内存中缓存一部分数据&#xff0c;减少了直接从内存到磁盘或从磁盘到内存的频繁IO操作&#xff0c;从而提高了读写效率。缓冲区大小调整…