MySQL事务 | 隔离级别 | 数据一致性

news2024/11/26 22:46:57

文章目录

    • 简介
    • 一、事务并发问题
      • 1. 脏读(Dirty Read)
      • 2. 不可重复读(Non-repeatable Read)
      • 3. 幻读(Phantom Read)
      • 幻读和不可重复读的区别
    • 二、事务隔离级别
      • 1. 回顾事务
      • 2. 事务级别
      • 3. 特点和优缺点
    • 三、事务隔离级别原理
      • 1. 读-未提交原理:
      • 2. 读-已提交原理:
      • 3. 可重复读原理:
      • 4. 串行化原理:
      • MVCC(多版本并发控制)
    • 总结

简介

  MySQL中的锁定机制对于数据库操作至关重要。事务隔离级别的选择和并发问题的解决是为了保证数据的一致性




一、事务并发问题


  MySQL事务并发问题主要包括脏读、不可重复读和幻读。这些问题可能会导致数据的不一致性,因此在设计和实现数据库应用时需要注意并发控制。

1. 脏读(Dirty Read)

  • 定义:一个事务读取了另一个未提交事务的数据。
  • 场景:事务A读取了事务B尚未提交的数据,而事务B最终可能会回滚,导致事务A读取到了无效的数据。

2. 不可重复读(Non-repeatable Read)

  • 定义:在同一个事务内,多次读取同一数据,但得到的结果不一致。
  • 场景:事务A在读取某个数据后,事务B修改了该数据并提交,事务A又读了刚才读过的数据(事务A没提交),发现两次读取的结果不一致。

3. 幻读(Phantom Read)

  • 定义:在同一个事务内,多次执行相同的查询,但得到的结果集不一致。
  • 场景:事务A在执行某个查询时,事务B插入了符合查询条件的新数据并提交,导致事务A多次执行相同查询时结果集不一致。

幻读和不可重复读的区别

  • 幻读主要发生在范围查询中,由于其他事务插入了新的记录,导致第二次查询返回了不同的结果集。
  • 不可重复读主要发生在单行查询中,由于其他事务修改了该记录,导致多次读取的结果不一致。




二、事务隔离级别


1. 回顾事务

  先说什么是Mysql事务:

  • 事务是由一个或多个SQL语句组成的逻辑单元。
  • 事务可以包含对数据库的读取、插入、更新和删除等操作。
  • 这些SQL语句按照一定的顺序执行,并作为一个整体来处理。
  • 事务具有ACID的特性。

  事务的目的是将一组相关的数据库操作视为一个不可分割的单元,要么全部执行成功,要么全部回滚。这样可以确保数据库的一致性和完整性,并提供并发控制和故障恢复机制。


  为了解决并发问题,MySQL提供了不同的事务隔离级别。

在这里插入图片描述

2. 事务级别

MySQL提供了四个隔离级别,分别是:

  • 读未提交(Read Uncommitted)
  • 读已提交(Read Committed)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)

3. 特点和优缺点

下面是事务的四种隔离级别的优点、缺点,解决的问题以及适用的使用场景

  1. 读未提交

    • 优点:并发性最高,读取不会被阻塞。
    • 缺点:存在脏读(Dirty Read)问题,读取到未提交的数据;不保证数据的一致性和完整性;可能出现幻读和不可重复读问题。
    • 解决的问题:无。
    • 使用场景:很少使用,通常不推荐在生产环境中使用,仅在特殊情况下使用。

  2. 读已提交

    • 优点:读取已提交的数据,避免了脏读问题;适用于大多数事务性应用程序的默认隔离级别。
    • 缺点:可能出现不可重复读和幻读问题;读取操作可能会被阻塞等待写入操作完成。
    • 解决的问题:解决脏读问题。
    • 使用场景:适用于大多数事务性应用程序,对数据一致性要求较高,但可以容忍不可重复读和幻读的场景。

  3. 可重复读(默认)

    • 优点:保证同一事务中多次读取同一数据的一致性;避免了不可重复读问题;默认的InnoDB存储引擎隔离级别。
    • 缺点:可能出现幻读问题;写入操作可能会被阻塞等待读取操作完成。
    • 解决的问题:解决不可重复读问题。
    • 使用场景:适用于对数据一致性要求较高,且不允许出现不可重复读的场景。

  1. 串行化
    • 优点:提供最高的数据一致性和完整性;保证了事务的串行执行,避免了幻读和不可重复读问题。
    • 缺点:并发性最低,读写操作都可能会被阻塞等待其他事务完成;可能导致性能下降。
    • 解决的问题:解决幻读和不可重复读问题。
    • 使用场景:适用于对数据一致性要求极高,且要求避免幻读和不可重复读的场景,例如财务系统等。



三、事务隔离级别原理


  在MySQL中,每个事务都有自己的隔离视图,用于确定事务可以看到哪些数据。隔离级别决定了事务在读取数据时能否看到其他事务的未提交数据、已提交数据的哪个版本,以及是否可以并发地修改同一数据。

  MySQL使用锁定来实现隔离级别。当一个事务读取或修改某个数据时,会对该数据进行相应的锁定,以防止其他事务对其进行干扰。不同的隔离级别使用不同类型的锁定来实现不同的并发控制策略。

下面是MySQL各个隔离级别的实现原理:

1. 读-未提交原理:

  事务可以读取其他事务未提交的数据。这个级别的实现方式是没有使用任何锁定,因此可能会出现脏读(读取到未提交的数据)的问题。

2. 读-已提交原理:

  让事务只能读取已提交的数据,采用的是以下方式解决脏读问题:

  • 事务隔离性:
    确保一个事务只能读取到已经提交的数据,而不能读取到未提交的数据。这意味着如果一个事务正在进行修改并尚未提交,其他事务将无法读取到这些未提交的修改。

  • 数据快照:
    在已提交读中,数据库引擎会创建一个数据快照,即在事务开始时记录数据库的一个快照,并在事务执行期间使用该快照来处理读操作。这样,即使其他事务对数据进行了修改,已提交读的事务也只会读取到它开始时的快照数据,而不会读取到其他事务未提交的修改。

  • 加读取锁:
    会自动使用读取锁(Shared Lock)来保护正在读取的数据,以防止其他事务对该数据进行修改。当一个事务正在读取某个数据时,其他事务无法对该数据进行写操作,只能读,必须等锁释放后修改。

3. 可重复读原理:

  在已提交读的基础上进一步防止了脏读和不可重复读。除了已提交读的机制外,可重复读还引入了以下几个措施来解决这些并发问题:

  • 加读取锁:
    与已提交读类似,可重复读事务在读取数据时会获取读取锁,防止其他事务对该数据进行修改。其他事务仍可以读取该数据,但无法对其进行写操作。这样可以确保在可重复读事务执行期间,其他事务不会对已读取的数据做任何修改。

  • 加写入锁:
    可重复读事务在修改数据时,会获取写入锁,防止其他事务读取或修改该数据。写入锁排斥其他事务的读锁和写锁,确保修改操作的原子性。其他事务必须等待写入锁释放后才能继续对该数据进行操作。

  • 快照读:
    可重复读事务在读取数据时,不仅使用数据快照来处理读操作,还会保持整个事务期间使用相同的快照。这意味着在可重复读事务中,无论其他事务如何修改数据,可重复读事务始终读取到的是它开始时的一致数据视图。这样可以防止脏读和不可重复读的问题。

4. 串行化原理:

  串行化是数据库中最高级别的事务隔离级别,它提供了最强的隔离性,并且可以防止脏读、不可重复读和幻读。串行化级别采用了以下措施来解决这些并发问题:

  • 加写入锁:
    在串行化级别下,事务在读取和修改数据时会获取写入锁,这会阻止其他事务对相同数据进行读取或修改操作。其他事务必须等待写入锁释放后才能继续对该数据进行操作。写入锁保证了事务的原子性和一致性。

  • 事务串行执行:
    串行化级别要求事务按照串行的方式依次执行,即每个事务必须在前一个事务完成之后才能开始执行。这样可以避免并发执行导致的并发问题,确保事务之间没有交叉的读写操作。



MVCC(多版本并发控制)

  另外,MySQL还使用了多版本并发控制(MVCC)来提高并发性能。

  MVCC通过为每个事务创建一个可见性视图来实现事务的隔离性,从而在一定程度上提高了并发性能。

  • 版本控制:
    MVCC机制通过在数据库中保存数据的多个版本来处理并发操作。每个事务在开始时都会创建一个可见性视图,该视图定义了事务开始时可见的数据版本。这意味着在事务执行期间,它只能看到在其开始之前已经提交的数据版本。

  • 读操作:
    对于读操作,MVCC允许事务读取已经提交的数据版本,而不会被其他事务的并发写操作所干扰。当一个事务开始时,它会记录事务开始时的系统版本号(或称为事务ID)。在事务执行期间,它只会看到早于该版本号的已提交数据版本,这样可以防止脏读和不可重复读的问题。

  • 写操作:
    对于写操作,MVCC采用了Copy-On-Write(写时复制)策略。当事务要进行写操作时,它会复制要修改的数据,并为该事务创建一个新的数据版本。这样,其他事务仍然可以读取旧的数据版本,而不会受到正在进行的写操作的影响。只有在事务提交时,新版本的数据才会变为其他事务可见的数据。

  • 版本清理:
    为了控制数据版本的数量,MySQL定期进行版本清理。当一个事务提交后,旧的数据版本将不再需要,并且可以被清理回收。版本清理可以通过不同的策略进行,例如基于事务ID的可回收版本链、基于时间戳的版本清理等。这样可以保持数据版本的数量在一个可控的范围内,避免无限增长。

  MVCC机制使得事务可以同时进行读写操作而不会相互干扰。这提高了并发性能,但并不能解决幻读问题,对于需要更严格的隔离性要求的场景,可以使用串行化隔离级别来避免这些问题。



总结


  综上所述,MySQL事务并发问题是在多个事务同时访问和修改数据库时可能出现的数据一致性问题。通过选择合适的隔离级别、合理设计事务和并发控制策略,可以有效地处理并发问题并确保数据的一致性。

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

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

相关文章

科研笔记:一些有用的网站整理(更新中)

1 论文整理网站 整理AI相关领域的一些综述GitHub - KaiyuanGao/AI-Surveys: 整理AI相关领域的一些综述时间序列的paper/code汇总GitHub - qingsongedu/awesome-AI-for-time-series-papers: A professional list of Papers, Tutorials, and Surveys on AI for Time Series in t…

OpenSource - Spring Startup Ananlyzer

文章目录 🚀Optimization of Spring Startup核心能力📈Spring应用启动数据采集报告应用启动时长优化 📈Spring应用启动数据采集报告安装jar包配置项应用启动自定义扩展 🚀应用启动时长优化支持异步化的Bean类型接入异步Bean优化 开…

idea配置类注解和方法注解最详细教材

1.配置类注释 点击setting 方法一: 1.按照要求添加下图中的模板 /*** Author: aaa* Date: ${YEAR}/${MONTH}/${DAY}* Description: */ 2.勾选下面的两个勾后点击apply 方法二: 我们看到了在刚刚那个模板中有这样一句话 这句话是表示创建项目的时候会…

CASAIM与大疆达成全自动化测量技术合作,CASAIM IS全自动化蓝光测量仪实现无人机叶片全尺寸检测及质量控制

近期,CASAIM与大疆达成全自动化测量技术合作,CASAIM IS全自动化蓝光测量仪实现无人机叶片全尺寸检测及质量控制。 无人机行业在过去几年里取得了迅猛发展,大疆是全球领先的无人飞行器控制系统及无人机解决方案的研发商和生产商,客…

2023年网页设计制作工具盘点

过去,专业人员使用HTMLL、CSS、Javascript等代码手动编写和构建网站。现在有越来越多的智能网页制作工具来帮助任何人实现零代码基础,随意建立和设计网站。在本文中,我们将向您介绍2023年流行的网页制作工具。 1.即时设计 即时设计是一款UI…

​python接口自动化(三十一)--html测试报告通过邮件发出去——下(详解)​

简介  本篇总结了 QQ (SSL)邮箱和 163(非SSL) 邮箱发送邮件,专治各种不行,总之看完这篇以后麻麻再也不用担心我的邮件收不到了。以下代码兼容 python2 和 python3,运行无异常,放心大…

Jmeter脚本参数化和正则匹配

目录 一、参数化 1.用户定义的变量 2.CSV数据文件设置 3.用户参数 二、正则提取 1.JSON提取器 2.正则表达式提取器 我们在做接口测试过程中,往往会遇到以下几种情况 每次发送请求,都需要更改参数值为未使用的参数值,比如手机号注册、…

python爬虫_requests获取小黄人表情保存到文件夹

文章目录 ⭐前言💖 requests简介(发送请求)💖 urlretrieve简介(下载远程图片)💖 获取图片的接口保存到本地💖 加餐环节:前端vue3antd展示图片 ⭐结束 ⭐前言 大家好&…

Hightopo 使用心得(4)- 3D 场景 Graph3dView 与 Obj 模型

在前一篇文章《Hightopo 使用心得(3)- 吸附与锚点》中,我们在结尾处提到过 HT 的 3D 场景。这里我们通过代码建立一个 3D 场景并添加一个 Obj 模型来介绍一下 HT for Web 在 3D 场景和模型加载方面的使用。 这是我们最终实现的效果&#xff…

vue3使用monaco-editor插件,报错Unexpected usage

在使用monaco-editor插件的时候,运行时没有报错,打开页面报如上错误,可以关掉,但是页面变了 还会再出现,上网找了一圈报错,是因为插件引入时产生的问题 原来的 import * as Monaco from monaco-editor更改…

论文笔记--TinyBERT: Distilling BERT for Natural Language Understanding

论文笔记--TinyBERT: Distilling BERT for Natural Language Understanding 1. 文章简介2. 文章概括3 文章重点技术3.1 Transformer Distillation3.2 两阶段蒸馏 4. 数值实验5. 文章亮点5. 原文传送门6. References 1. 文章简介 标题:TinyBERT: Distilling BERT fo…

Java四个月学不学的会?我分享一下我的经历来告诉你

先说结论,java培训 四个月一般是能达到能上手工作的水平的,但是高中毕业就算了。高中毕业哪怕你能上手工作了,需求能完成了,也是大概率找不到工作的,这一行可能最看重学历的行业之一了。虽然说句实在话,就…

【Linux】基础开发工具——gcc/g++篇

文章目录 一、预处理1.1 头文件展开1.2 条件编译 二、编译三、汇编四、链接4.1 什么是库?4.2 库的分类4.3 目标文件和库是如何链接的?4.3.1 动态链接4.3.2 静态链接 4.4 动静态链接的优缺点对比 五、Debug&&release 前言 :  在前面的文章里给大…

VMware将虚拟机网络设置为NAT模式

虚拟机有vmware和desktop,本人一直使用的是vmware。安装好vmware并激活后,创建完虚拟机。(需要vmware和激活码的可留言) 进入虚拟机设置,网络适配器选择NAT模式 在虚拟机工具栏->菜单栏点击编辑,选择“虚拟网络编辑器”。 选择…

数据库应用:MySQL数据库用户管理

目录 一、理论 1.用户管理 2.授权控制 二、实验 1.数据库用户管理 2.数据库用户授权 三、总结 一、理论 1.用户管理 (1)用户信息 MySQL 中的用户信息,都存储在系统数据库 mysql 的 user 表中。 use mysql; select * from user lim…

【038】解码C++ STL:探索string容器的无限可能与鲜为人知的技巧

解码C STL:探索string容器的无限可能与鲜为人知的技巧 引言一、STL概述1.1、STL的基本概念1.2、STL的六大组件 二、string类2.1、string容器基本概念2.2、string容器常用操作2.2.1、string构造函数2.2.2、string基本赋值操作2.2.3、string存取字符操作原型2.2.4、st…

我们搬家啦!新家园,新征程,新篇章

7月10日 KaiwuDB 上海新总部开业典礼暨 “浪潮数据库产业联合实验室”揭牌仪式 于上海市浦东新区顺利举行 新起点,新征程,新篇章 🎉🎉 剪彩仪式 7月10日,上海浦东新区科技和经济委员会副主任夏玉忠,上…

行业追踪,2023-07-11,关于自动生成文章代码重构,明天开始发布新的追踪文章,敬请期待

自动复盘 2023-07-12 成交额超过 100 亿 排名靠前,macd柱由绿转红 成交量要大于均线 有必要给每个行业加一个上级的归类,这样更能体现主流方向 rps 有时候比较滞后,但不少是欲杨先抑, 应该持续跟踪,等 macd 反转时参与…

GoLand导入redis的github包失败

GoLand导入redis依赖失败 网上有下载guryburd和gomodel的,这里按照官网文档安装依赖 以下命令在项目的根目录执行 初始化一个Go模块: go mod init github.com/my/repoTo install go-redis/v9:要安装go-redis/v9: go get github.com/redis/…

大模型技术发展概述 -(二)

文本内容参考论文《A Survey of Large Language Models》 论文标题:A Survey of Large Language Models 论文链接:https://arxiv.org/pdf/2303.18223v10.pdf 大模型技术发展概述 -(二) 4. LLM预训练4.1 数据收集4.1.1 数据源4.1.2…