当前位置: 首页 > news >正文

【MYSQL】事务的4大属性,对隔离级别的详细讲解

目录

1.原子性和持久性

1.1.手动提交事务

1.2.自动提交事务

 1.3.事务的原理:

2.隔离性

1.读未提交(Read Uncommitted)

 2.读提交(Read Committed)

3.可重复读

4.串行化

3.一致性

4.理解读提交和可重复读的实现原理区别

4.1.模拟 MVCC

4.2.read view

4.3.RR 与 RC的本质区别


事务的4大属性:原子性,持久性,隔离性,一致性;

在mysql中只有innodb支持事务,myisam是不支持事务的;

事务的作用:

  1. 由于事务的隔离性,多个用户同时访问数据库时不必担心相互之间的影响,提高并发性和数据安全性;
  2. 事务的提交和回滚操作还可以保证数据的安全性和完整性;

1.原子性和持久性

1.1.手动提交事务

1.事务的基本操作 

  1. 使用begin或者start transaction,创建事务
  2. 中间可以增删改操作
  3. 使用commit提交事故 

2.创建保存点和回滚操作

  • savepoint  标记;
  • rollback to  标记:回滚到标记位置;rollback回滚到事务开头(begin位置)

只要事务未提交(未commit)就可以使用回滚操作 

1.2.自动提交事务

查看自动提交事务状态:show variables like 'autocommit';
设置为关闭:SET AUTOCOMMIT=0; 
设置为开启:SET AUTOCOMMIT=1; 

由下图可以得出:

  1. 自动提交事务是对输入单条sql语句(不使用手动提交的情况)做自动提交;
  2. 如果关闭自动提交,那么单条sql不会被写入磁盘,保证原子性; 

 1.3.事务的原理:

原子性:要么做完,要么不做,没有中间态 ;可以分为3个状态,执行前,执行中,执行后;

1.事务的3个状态可以为

  • 执行前:使用begin从磁盘中把数据拿到内核缓冲区,再从内核缓冲区拷贝到用户层的buffer pool中,简单的说就是把磁盘数据保存到内存的用户层的缓冲区;
  • 执行中:使用sql语句对拿到内存中数据进行增删改;
  • 执行后:使用commit把修改的内存数据,拿到磁盘去;

如何保证的原子性:如果不使用commit交付数据,事务结束后就自动会回滚到执行前,使用commit交付数据那么就是执行后

持久性是什么:就是已经交付的数据(commit),就会保存在磁盘中且不受回滚的约束

2.隔离性

  • MySQL服务可能会同时被多个客户端进程(线程)访问访问的方式以事务方式进行(并发执行)
  • 数据库中,为了保证事务并发执行过程中尽量不受干扰,就有了一个重要特征:隔离性
  • 在不同的场景需要不同的隔离级别:有4种,读未提交、读提交、可重复读、串行化

查看设置隔离级别:

select @@global.tx_isolation;查看全局隔离级别

select @@session.tx_isolation;查看会话隔离级别

设置隔离等级格式:set session/global transaction isolation level read uncommitted/read committed/repeatable read/serializable; //全局和会话选一个,隔离等级4选1;

设置会话隔离等级

1.读未提交(Read Uncommitted)

在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。(实际生产中不可能使用这种隔离级别的),但是相当于没有任何隔离性,也会有很多并发问题;(脏读,幻读,不可重复读);

脏读:一个事务进行增删改,另一个正在执行的事务可以读取到未提交(commit)的数据; 

脏读的问题举例:要对查询到表的多条记录发奖励,另外一个事务新增了一行记录且没有提交,那么奖励多发一个; 

 2.读提交(Read Committed)

该隔离级别是大多数数据库的默认的隔离级别(不是 MySQL 默认的)。它满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变,不可重复读的问题

不可重复读:多个事务并发执行,一个事务增/删/改一条数据且提交,其他的正在执行的事务就可以看到这条数据;

不可重复的问题举例:我们按分数发奖励,100分发100块钱,90分发50块钱,80分发30块,小明得了100分,在比较100分的时候给他发100块,在比较90分的时候入过另一个事务把小明改为90分并且提交,那么小明又可以得到50块,那么就出问题了

 

3.可重复读

概念:这是MySQL默认的隔离级别,它确保同一个事务,在执行中,多次读取操作数据时,会看到同样的数据行。但是一般数据库会有幻读问题,mysql没有这个问题被解决了

幻读:这一系列隔离都是加锁完成的,但是新增的数据没到磁盘一般锁不能限制,所以其他事务插入,查询时会看到新增数据,mysql是使用Next-Key锁(GAP+行锁)解决的;

 

4.串行化

 概念:: 这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了 幻读的问题。它在每个读的数据行上面加上共享锁。但是可能会导致超时和锁竞争(这种隔离级别太极端, 实际生产基本不使用)

3.一致性

例如转账问题A有1000¥,B有800¥,A给B转账200¥,A有800¥B拥有1000¥;

一致性的概念:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。A有1000B有800是一个一致性状态,A有800B有1000是另一个一致性状态;

如何保证转账成功呢,防止A转账了,B没有收到了,

  1. 有回滚和提交这种方法(原子性),保护已经修改的数据不会回滚(持久性),并发执行不受影响(隔离性);
  2. 用户对A和B的数据修改

由上可得:一致性并没有具体的实例,是由用户和mysql的特性来共同来维护的概念

4.理解读提交和可重复读的实现原理区别

数据库并发的场景有三种:

  • 读读:不存在任何问题,也不需要并发控制;
  • 读写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读
  • 写写:有线程安全问题,可能会存在更新丢失问题

读写

多版本并发控制( MVCC )是一种用来解决 读-写冲突 的无锁并发控制

4个记录隐藏列字段:

  • DB_TRX_ID :6 byte,最近修改( 修改/插入 )事务ID,记录创建这条记录/最后一次修改该记录的事务ID,识别不同事务身份;
  • DB_ROLL_PTR : 7 byte,回滚指针,指向这条记录的上一个版本(简单理解成,指向历史版本就行,这些数据一 般在 undo log 中)
  • DB_ROW_ID : 6 byte,隐含的自增ID(隐藏主键)如果数据表没有主键, InnoDB 会自动以 DB_ROW_ID 产生一 个聚簇索引
  • 删除flag隐藏字段, 既记录被更新或删除并不代表真的删除,而是删除flag变了,flag=0未删,flag=1已删除(内存)

加上隐藏列: 

undo日志

  • 是一个内存缓冲区,用来保存日志数据;

4.1.模拟 MVCC

修改张三这行记录的过程

  • 事务10,因为要修改,所以要先给该记录加行锁。
  • 修改前,现将改行记录拷贝到undo log中,所以,undo log中就有了一行副本数据。(原理就是写时拷贝)
  • 所以现在 MySQL 中有两行同样的记录。现在修改原始记录中的name,改成 '李四'。并且修改原始记录的隐藏字段 DB_TRX_ID 为当前 事务10 的ID, 我们默认从 10 开始,之后递增。而原始记录的回滚指针 DB_ROLL_PTR 列, 里面写入undo log中副本数据的地址,从而指向副本记录,既表示我的上一个版本就是它
  • 事务10提交,释放锁。

现在有一个事务11,要对当前记录的age修改为38;

 这样,我们就有了一个基于链表记录的历史版本链。所谓的回滚,无非就是用历史数据,覆盖当前数据

  • 上面的一个个版本,我们可以称之为一个个的快照。
  1. 当前读:读取最新的记录,就是当前读。增删改,都叫做当前读,select也有可能当前读,比如:select lock in share mode(共享锁), select for update
  2. 快照读:读取历史版本(一般而言),就叫做快照读。

4.2.read view

read view是一个类(mysql1使用c++实现),下面是它的一部分;

class ReadView {
// 省略...
private:/** 高水位,大于等于这个ID的事务均不可见*/
trx_id_t m_low_limit_id/** 低水位:小于这个ID的事务均可见 */
trx_id_t m_up_limit_id;/** 创建该 Read View 的事务ID*/
trx_id_t m_creator_trx_id;/** 创建视图时的活跃事务id列表*/
ids_t m_ids;
//省略...
};
  1. 无论是读提交还是可重复读都遵守下面的概念;它们两的区别不在这里,所以不要想着它们的概念来理解下面的图,反而更难理解
  2. 由read view来决定可不可读,形成快照后分为3部分,第一部分都可读,第二部分提交的就可读,第三部分都不可读;
  • 第一部分:creator_limit_id==DB_TRX_ID就是自己的事务id当然可读,DB_TRX_ID<up_limit_id说明不在这个m_ids(活跃事务id列表)范围之内,而且因为事务id自增长的,比最小活跃事务还小说明它以前已经提交的;
  • 第二部分:up_limit_id到low_limit_id之间;不就是m_ids里面的活跃事务吗;那么已经提交的可读,未提交不可读(这里不是不可重复读问题,读提交和可重复读都支持read view来决定可不可读概念,下面说明它们的区别是读提交每次快照读就会生成一个新的read view,可重复读快照读生成一个read view就不会再生成了);
  • 第三部分:DB_DRX_ID>=low_limit_id,比m_ids的所以活跃事务都大,那么是不可读的;

4.3.RR 与 RC的本质区别

可重复读隔离等级下

 

  •  用例1与用例2:唯一区别仅仅是 表1 的事务B在事务A修改age前 快照读 过一次age数据
  • 而表2的事务B在事务A修改age前没有进行过快照读。

RR 与 RC的本质区别:

  • 正是Read View生成时机的不同,从而造成RC,RR级别下快照读的结果的不同
  • 在RR级别下的某个事务的对某条记录的第一次快照读会创建一个快照及Read View, 将当前系统活跃的其他事务记录起来(m_ids)
  • RR级别此后在调用快照读的时候,还是使用的是同一个Read View,所以只要当前事务在其他事务提交更新之前使用(活跃事务)过快照读,那么之后的快照读使用的都是同一个Read View,所以对之后的修改(第三部分)不可见;
  • 而在RC级别下的,事务中,每次快照读都会新生成一个快照和Read View, 这就是我们在RC级别下的事务中可以 看到别的事务提交的更新的原因
  • 在RC隔离级别下,是每个快照读都会生成并获取最新的Read View;而在RR隔离级别下,则是同一个事务 中的第一个快照读才会创建Read View, 之后的快照读获取的都是同一个Read View。
  • 正是RC每次快照读,都会形成Read View,所以,RC才会有不可重复读问题。

相关文章:

【MYSQL】事务的4大属性,对隔离级别的详细讲解

目录 1.原子性和持久性 1.1.手动提交事务 1.2.自动提交事务 1.3.事务的原理&#xff1a; 2.隔离性 1.读未提交&#xff08;Read Uncommitted&#xff09; 2.读提交&#xff08;Read Committed&#xff09; 3.可重复读 4.串行化 3.一致性 4.理解读提交和可重复读的实现…...

如何在宝塔面板后的阿里云服务器运行Flask项目并公网可以访问?

在你的服务器安装宝塔面板 宝塔面板是服务器运维管理系统 使用宝塔前&#xff1a; 手工输入命令安装各类软件&#xff0c;操作起来费时费力并且容易出错&#xff0c;而且需要记住很多Linux的命令&#xff0c;非常复杂。 使用宝塔后&#xff1a; 2分钟装好面板&#xff0c;一键…...

HTTP(九)-- response对象 -- 向页面响应数据

目录 1. 服务器输出字符数据到浏览器 1.1 获取字符输出流 1.2 实例演示:...

音视频windows安装ffmpeg6.0并使用vs调试源码笔记

建立在上一步&#xff0c;vs已经能够正常调试qt项目&#xff0c;可以实现&#xff1a; 1&#xff1a;qt可以使用mvsc &#xff08;使用cdb&#xff09;进行调试。 2&#xff1a;vs已经可以加载qt项目&#xff0c;借助vs进行调试。 本文目标&#xff1a;编译ffmpeg库&#xf…...

Midjourney|文心一格prompt教程[进阶篇]:Midjourney Prompt 高级参数、各版本差异、官方提供常见问题

Midjourney|文心一格prompt教程[进阶篇]&#xff1a;Midjourney Prompt 高级参数、各版本差异、官方提供常见问题 1.Midjourney Prompt 高级参数 Quality 图片质量是另一个我比较常用的属性&#xff0c;首先需要注意这个参数并不影响分辨率&#xff0c;并不改变分辨率&#x…...

什么是Java虚拟机(JVM)?

Java虚拟机&#xff08;Java Virtual Machine&#xff0c;JVM&#xff09;是Java平台的关键组成部分之一。它是一种虚拟的计算机&#xff0c;可以在计算机上运行Java字节码&#xff08;即编译后的Java程序&#xff09;。 JVM具有以下主要功能&#xff1a; 字节码执行&#xff…...

【HISI IC萌新虚拟项目】Package Process Unit模块整体方案·PART3

5. 模块方案说明 5.1CRG 模块方案说明 5.1.1简介 CRG 模块实现复位信号的滤抖功能,可滤除小于100ns的低电平复位毛刺,并对复位信号进行同步化处理。同时,对100MHz的输入时钟信号进行2分频,作为 CPU_IF模块和TEST_CORE模块的工作时钟。 5.1.2接口信号 信号位宽I/O描述...

分布式事务常见解决方案

分布式事务常见解决方案 一、事务介绍 事务是一系列的动作&#xff0c;它们综合在一起才是一个完的工作单元&#xff0c;这些动作必须全部完成&#xff0c;如果有一个失败的话&#xff0c;那么事务就会回滚到最开始的状态&#xff0c;仿佛什么都没发生过一样。 1、单事务概念…...

061:cesium设置棋盘图材质(material-5)

第061个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置棋盘材质,请参考源代码,了解CheckerboardMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共89行)相关API参考:专栏目标…...

【AI Earth试玩】权限配置与openAPI调用工具库

前言 AI earth是阿里达摩院出的遥感云计算平台&#xff0c;我简单体验下来感觉像是GEE的python版本遥感深度学习计算平台&#xff0c;整体体验还是挺不错的&#xff0c;尤其是多分类的结果还是挺惊艳的。 平台提供工具箱和notebook两种模式&#xff0c;工具箱整个交互简单易用…...

Tomcat安装与使用

Tomcat 是HTTP服务器&#xff0c;用于使用HTTP协议。 1、下载Tomcat 下载链接&#xff1a;https://tomcat.apache.org/ 进入官网后&#xff0c;根据自己想要下载的版本进行下载&#xff0c;我这里选择下载的版本是Tomcat 8. 点击选择自己想要下载的对应版本&#xff0c;下载Z…...

大数据课程-学习二十四周总结

6.Hive函数 Hive的函数分为三类&#xff1a; 聚合函数、内置函数&#xff0c;表生成函数&#xff0c;聚合函数之前已经学习过了&#xff0c;接下来学习内置函数和表生成函数. 6.1.Hive的内置函数 6.1.1.数学函数 6.1.1.1. 取整函数: round 语法: round(double a) 返回值: BIG…...

【GPT科技系列】国内开发者调用openAI-API科技方法

1. 前言 openAI上线7个月了&#xff0c;但是随着openAI的约束越来越多&#xff0c;国内开发者想要使用openai的接口实现开发简直就是难上加难。那真的就没有办法了吗&#xff1f;no no no&#xff0c;CF解决一切不开心~ 2.准备工作 我们需要一个国际域名 注册cloudflare账号 …...

基于QGIS的长株潭城市群边界范围融合实战

背景 在面向区域的研究过程中&#xff0c;比如一些研究区域&#xff0c;如果是具体的行政区划&#xff0c;比如具体的某省或者某市或者县&#xff0c;可以直接从国家官方的地理数据中直接下载就可以。但如果并没有直接的空间数据那怎么办呢&#xff1f;比如之前遇到的一个场景&…...

【MySQL联合查询】轻松实现数据关联

1、联合查询 联合查询又称为多表查询&#xff0c;它的基本执行过程就是笛卡尔积 1.1 认识笛卡尔积 那么什么是笛卡尔积呢&#xff1f; 答&#xff1a;笛卡尔积就是将两张表放在一起进行计算&#xff0c;把第一张表的每一行分别取出来和第二张表的每一行进行连接&#xff0c;得到…...

Windows安装Ubuntu双系统

Windows安装Ubuntu双系统 1.下载Ubuntu 16.04&#xff0c;地址https://releases.ubuntu.com/16.04/ 2.下载Rufus&#xff0c;地址https://rufus.ie/zh/ 3.准备U盘&#xff0c;烧录系统 4.磁盘分区 5.重启&#xff0c;按住shift键 本人电脑是联想小新 Windows11系统&#xff0…...

【大数据之Hadoop】三十四、Hadoop综合调优之小文件优化方法

1 Hadoop小文件弊端 HDFS上每个文件都要在NameNode上创建对应的元数据&#xff0c;这个元数据的大小约为150byte&#xff0c;这样当小文件比较多的时候&#xff0c;就会产生很多的元数据文件&#xff0c;一方面会大量占用NameNode的内存空间&#xff0c;另一方面就是元数据文件…...

周赛 Round#3 题解

又不能放图片&#xff0c;又不能写学校&#xff0c;你让我怎么办啊&#xff01;&#xff01; 系列文章目录 1.周赛 Round#1 2.周赛 Round#2 前言 这是周赛第三轮。//涉及隐私原因&#xff0c;博文里不放题目&#xff0c;要看的去http://0241:101:610:801.22222 划分字符串贪…...

详解HTTPS加密过程

目录 前言 HTTPS是什么 HTTPS的工作过程 引入对称加密 引入非对称加密 引入证书 总结 前言 对于HTTP上篇文章已经做了详细的解释了。众所周知&#xff0c;HTTPS要比HTTP要安全&#xff0c;但是为什么HTTPS要比HTTP安全呢&#xff1f; 这篇文章主要研究HTTPS的加密机制…...

聚观早报 | ChatGPT登顶美区iOS免费榜;库克不满苹果首款MR设备

今日要闻&#xff1a;ChatGPT登顶美区iOS免费榜&#xff1b;库克不满苹果首款MR设备&#xff1b;索尼正开发小尺寸折叠屏手机&#xff1b;万达辟谣大规模裁员&#xff1b;智能仿生手让截肢者重获手心的温度 ChatGPT登顶美区iOS免费榜 ChatGPT 在 iOS 美区免费 App 排行榜上位列…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...