mysql的隔离级别,和实现

参考链接
https://xiaolincoding.com/mysql/transaction/mvcc.html#%E4%BA%8B%E5%8A%A1%E7%9A%84%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B

事务特性(ACID)

  1. 原子性(Atomicity): 事务是原子的,意味着事务中的所有操作要么全部成功执行,要么全部失败回滚。如果事务中的任何一个操作失败,整个事务将被回滚到初始状态,不会产生部分提交的结果。

  2. 一致性(Consistency): 事务的执行将使数据库从一个一致性状态转换到另一个一致性状态。这意味着事务执行过程中,数据库中的数据约束、关系和规则将得到维护和保持,保证数据库的完整性。

  3. 隔离性(Isolation): 数据库允许 多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的。也就是说,消费者购买商品这个事务,是不影响其他消费者购买的。

  4. 持久性(Durability): 事务一旦提交,其对数据库的修改应该是永久性的,即使发生系统崩溃或断电等故障,事务提交的结果也应该被永久保存在数据库中。

通过什么保证事务的特性

InnoDB 引擎保证事务的四个特性

  1. 持久性是通过 redo log (重做日志)来保证的;
  2. 原子性是通过 undo log(回滚日志) 来保证的;
  3. 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;【重点】
  4. 一致性则是通过持久性+原子性+隔离性来保证;

由于在并发执行多个事务时会出现交叉执行,导致数据不准确,因为需要进行事务的隔离

并发执行事务出现的问题

  1. **脏读(Dirty Read):指一个事务在读取了另一个事务未提交的数据时发生的现象。**例如,事务A修改了某行数据但还未提交,此时事务B读取了这个未提交的数据,如果事务A后来回滚了,则事务B读取到的数据实际上是无效的,这就是脏读
  2. 不可重复读(Non-repeatable Read):指在一个事务内,多次读取同一行数据时,由于其他事务对该行数据做了修改或删除,导致不同读取之间出现了不一致的情况。 例如,事务A在读取某行数据后,事务B修改了该行数据并提交,然后事务A再次读取同一行数据,此时读取到的数据与之前不一致,这就是不可重复读。
  3. 幻读(Phantom Read):指在一个事务内,多次执行同一个查询时, 由于其他事务对数据进行了插入或删除操作,导致查询结果集合不一致的现象。 例如,事务A在查询某个范围内的数据时,事务B在该范围内插入了新的数据,然后事务A再次查询同一范围的数据,发现结果集合中出现了之前不存在的新数据,这就是幻读。

事务的隔离级别

  1. 读未提交(Read Uncommitted):最低的隔离级别,在该级别下,一个事务可以读取另一个事务未提交的数据。这种隔离级别可能导致脏读、不可重复读和幻读的问题。

  2. 读已提交(Read Committed):事务只能读取已经提交的数据,可以避免脏读,但仍可能出现不可重复读和幻读的问题。

3. 可重复读(Repeatable Read):在同一个事务中多次读取同一行数据时,保证读取到的数据是一致的。其他事务对数据的修改不会影响到当前事务的查询结果,避免了不可重复读的问题。但仍可能出现幻读的问题。
(InnoDB 引擎的默认隔离级别)

  1. 串行化(Serializable):最高的隔离级别,在该级别下,所有的事务都是按顺序执行的,事务之间不会相互影响,从而避免了脏读、不可重复读和幻读的问题。但是串行化级别会降低系统的并发性能,因为事务需要按顺序执行,无法并发执行。

隔离级别-----可重复读

MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了,文章详细描述https://xiaolincoding.com/mysql/transaction/phantom.html#%E4%BB%80%E4%B9%88%E6%98%AF%E5%B9%BB%E8%AF%BB),解决的方案有两种:

  1. 针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
  2. 针对当前读(select … for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select … for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

MVCC(Multi-Version Concurrency Control)

是一种用于数据库管理系统中的 并发控制 方法,用于解决多个事务并发访问数据库时可能出现的一致性和并发性问题。

在MVCC中,每个数据行都会有多个版本,而不是仅有一个版本。当一个事务对数据进行修改时,不会直接覆盖原始数据,而是创建一个新版本,并保留原始版本。其他事务在读取数据时,可以同时看到不同版本的数据,这样就实现了事务之间的隔离性。

MVCC的实现通常包括以下几个关键组件:

  1. 版本管理器(Version Manager): 负责管理数据行的版本信息,包括创建新版本、回收旧版本等操作。

  2. 版本链(Version Chain): 用于存储同一行数据的多个版本,通常是一个链表结构,每个节点代表一个版本。

  3. 快照读(Snapshot Read): 在MVCC中,事务可以通过读取数据行的某个特定版本(称为快照)来实现读一致性,而不会受到其他事务并发修改的影响。

MVCC的优点包括:

  • 提高了数据库的并发性能,因为读操作不会阻塞写操作,多个事务可以并发读取同一数据行的不同版本。
  • 避免了读-写之间的锁竞争,减少了锁冲突带来的性能损耗。
  • 实现了读一致性,每个事务看到的数据都是一致的,不会出现脏读、不可重复读等问题。

MVCC在许多现代数据库系统中得到了广泛的应用,例如MySQL、PostgreSQL等。

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

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

相关文章

CUDA C:核函数、主机函数、设备函数

相关阅读 CUDA Chttps://blog.csdn.net/weixin_45791458/category_12530616.html?spm1001.2014.3001.5482 核函数(Kernel Function)指的是在主机(CPU)调用(某些情况下也可以在设备调用),在设备(GPU)上执行的函数,使用__global__…

YOLOv8改进 | Conv篇 | 全新的SOATA轻量化下采样操作ADown(参数量下降百分之二十,附手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的ADown模块来改进我们的Conv模块,其中YOLOv9针对于这个模块并没有介绍,只是在其项目文件中用到了,我将其整理出来用于我们的YOLOv8的项目,经过实验我发现该卷积模块(作为下采样模块)…

CentOS 6.5安装配置SVN服务器

​项目要用SVN来管理,所以需要给服务器安装SVN服务器端。 这里仅使用svn://协议来访问SVN服务器,不启用sasl。 客户端系统都是Windows,使用起来很简单,这里就不用说了。 本文仅针对1.6.11版本。在1.7.14版本上测试时,…

liunx前后端分离项目部署

文章目录 1、nginx的安装和自启动2.nginx负载均衡3.前后端项目部署-后端部署4.前后端项目部署-前端部署 1、nginx的安装和自启动 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel1.安装我们nginx所需要的依赖 wget http://nginx.org/download/nginx-1.…

Open3D 点云法向量计算与可视化 (25)

Open3D 点云法向量计算与可视化 (25) 一、算法原理二、算法实现三、可视化显示和长度调节一、算法原理 通常计算点云的法向量可以使用以下两种常见的方法: 最小二乘法(Least Squares Method):该方法通过拟合局部表面的平面来计算法向量。对于给定点周围的邻域,可以通过…

故障排除:Failed to load SQL Modules into database Cluster

PostgreSQL 安装和故障排除 重新安装前的准备工作 在重新安装 PostgreSQL 之前,确保完成以下步骤: 重新卸载 PostgreSQL 并重启电脑。 删除以下目录: C:\Program Files\PostgreSQL\13C:\Users\admin\AppData\Roaming\pgadmin 重启安装过…

Vue2:router-link的replace属性

一、情景说明 我们在用浏览器访问网站的时候 知道浏览器会记录访问的历史路径,从而,可以退回到之前的页面 那么,Vue项目中的路由组件,通过router-link跳转,也是可以退回的 这里,我们用replace来屏蔽退回的…

【计算机网络】传输层——TCP和UDP详解

文章目录 一. TCP和UDP简介二. UDP 协议详解1. UDP报文格式2. UDP的使用场景 三. TCP 协议详解1. TCP报文格式2. TCP协议的重要机制确认应答(保证可靠传输的最核心机制)超时重传连接管理(三次握手、四次挥手)!&#xf…

内网设备如何在互联网上能访问

应用场景 设备安装到了客户现场,如果要调试设备,当前的处理方式是技术人员出差到客户现场、让客户开通VPN、让客户安装远程工具,远程到客户计算机上进行调试等方法。人不在家里想远程家里的电脑,当前处理方式就是在家里电脑上安装…

【信息提取】FindSomething 浏览器插件

下载地址 FindSomething 浏览器插件 概述 在网页的源代码或js中找到一些有趣的东西 FindSomething 用于快速在网页的html源码或js代码中提取一些有趣的信息,包括可能请求的资源、接口的url,可能请求的ip和域名,泄漏的证件号、手机号、邮箱…

Java多线程面试题(一)

Java多线程面试题(一) 前言1、在 Java 中守护线程和本地线程区别?2、线程与进程的区别?3、什么是多线程中的上下文切换?4、死锁与活锁的区别,死锁与饥饿的区别?5、Java 中用到的线程调度算法是什…

【Android12】Monkey压力测试源码执行流程分析

Monkey压力测试源码执行流程分析 Monkey是Android提供的用于应用程序自动化测试、压力测试的测试工具。 其源码路径(Android12)位于 /development/cmds/monkey/部署形式为Java Binary # development/cmds/monkey/Android.bp // Copyright 2008 The Android Open Source Proj…

Leetcoder Day21| 回溯理论基础+组合

语言:Java/Go 回溯理论基础 回溯函数也就是递归函数; 所有回溯法的问题都可以抽象为树形结构; 回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度,都构成的树的深度。 适用的题…

深度学习基础(一)神经网络基本原理

之前的章节我们初步介绍了机器学习相关基础知识,目录如下: 机器学习基础(一)理解机器学习的本质-CSDN博客 机器学习基础(二)监督与非监督学习-CSDN博客 机器学习基础(四)非监督学…

深入理解计算机系统学习笔记

2.3整数运算 有时候会发现两个正数相加会得出一个负数&#xff0c;而比较表达式x<y和比较表达式x-y<0会产生不同的结果。这些属性是由于计算机运算的有限性造成的。理解计算机运算的细微之处能够帮助程序员编写更可靠的代码。 2 .3. 1 无符号加法 原理&#xff1a; 在正…

前端学习---- 前端HTML基本元素的介绍

一&#xff1a;显示相关的HTML基础知识 1. 推荐的前端编写工具 2. VScode的html速写规则&#xff08;从a标签开始再用&#xff09; ①、&#xff01;&#xff1a;代表生成html的基本框架元素 ②、html元素&#xff1a;直接书写html,不需要加<>,按回车会自动生成 ③、{}…

Java之线程池:线程池常用类、接口;线程池执行流程,配置参数,分类

线程池 什么是线程池&#xff1f; 线程池&#xff1a;一种基于池化思想管理和使用线程的机制 线程池常用类和接口 ExecutorService接口&#xff1a;进行线程池的操作访问Executors类&#xff1a;创建线程池的工具类ThreadPoolExecutor及其子类&#xff1a;封装线程池的核心参…

蓝桥杯备战刷题(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

ChatGPT为什么会被热炒?

2023年上半年&#xff0c;ChatGPT引起了广泛的热议&#xff0c;对于ChatGPT有多热&#xff0c;不需要我重复了&#xff0c;你可能在网上看到了很多报道&#xff0c;标题如《ChatGPT揭开AI战幔&#xff1a;杀死黄页一样摧毁Google&#xff1f;》和《ChatGPT强势来袭&#xff0c;…

【技术分享】使用nginx完成动静分离➕集成SpringSession➕集成sentinel➕集成seata

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于技术点的相关分享吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 一、 使用nginx完成动静分离 1.下载…