Mysql的四个隔离级别是如何实现的

事务隔离级别是怎么实现的? 事务是在 MySQL 引擎层实现的,我们常见的 InnoDB 引擎是支持事务的,事务的四大特性是原子性、一致性、隔离性、持久性,我们这次主要讲的是隔离性。当多个事务并发执行的时候,会引发脏读、不可重复读、幻读这些问题,那为了避免这些问题,SQL 提出了四种隔离级别,分别是读未提交、读已提交、可重复读、串行化,从左往右隔离级别顺序递增,隔离级别越高,意味着性能越差,InnoDB 引擎的默认隔离级别是可重复读。 阅读详情

(一)事务四大属性

分别是原子性、一致性、隔离性、持久性。

     1、原子性(Atomicity)

 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

    2、一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。举例来说,假设用户A和用户B两者的钱加起来一共是1000,那么不管A和B之间如何转账、转几次账,事务结束后两个用户的钱相加起来应该还得是1000,这就是事务的一致性。

     3、隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

     4、持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务已经正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成。否则的话就会造成我们虽然看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。这是不允许的。

(二)事务的并发问题

脏读:事务A读取到了事务B中未提交的数据,当事务B回滚后,事务A读取到的数据都是脏数据。

不可重复读:事务A多次读取同一数据,但每次读取的值不同。这是因为事务B多次对数据进行更新和提交。

幻读:事务A在操作过程中,表数据多次新增或删除,并且新增或删除的数据影响到事务A的操作结果。

不可重复读侧重的是数据的修改,幻读侧重的是数据的新增或删除。解决不可重复读,只有锁住行,而解决幻读,需要锁住整张表。

(三)mysql的隔离级别

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(读未提交)、Read committed(读提交)、Repeatable read(可重复读取)、Serializable(可串行化),这四个级别可以逐个解决脏读、不可重复读、幻象读这几类问题。

事务隔离级别

脏读

不可重复读

幻读

未提交读

√

√

√

提交读

×

√

√

可重复读

×

×

√

串行化

×

×

×

隔离级别的实现:

未提交读(RU:read-uncommitted):在RU级别中,事务读到的所有数据都是最新的数据,可能是事务提交后的数据,也可能是事务执行中的数据(可能会被回滚)。

当隔离级别为RU时:

  • 所有的读不加锁,读到的数据都是最新的数据,性能最好。

  • 所有的写加行级锁,写完释放。

提交读(RC:read-committed):使用MVCC技术,在每一行加入隐藏的字段(DB_TRX_ID:修改该行的最后一个事务的id,DB_ROLL_PTR:指向当前行的undo log日志,DB_ROW_ID:行标识,DELETE_BIT:删除标志),它实现了不加锁的读操作。

当隔离级别为RC时:

  • 写操作:加行级锁。事务开始后,会在UNDO日志中写入修改记录,数据行中的隐藏列DATA_POLL_PTR存储指向该行的UNDO记录的指针。

  • 读操作:不加锁。在读取时,如果该行被其它事务锁定,则顺着隐藏列DATA_POLL_PTR指针,找到上一个有效的历史记录(有效的记录:该记录对当前事务可见,且DELETE_BIT=0)。

可重复读(RR:repeatable-read):使用MVCC技术来实现不加锁的读操作。

当隔离级别为RR时:

  • 写操作:加行级锁。事务开始后,会在UNDO日志中写入修改记录,数据行中的隐藏列DATA_POLL_PTR存储指向该行的UNDO记录的指针。

  • 读操作:不加锁。在读取时,如果该行被其它事务锁定,则顺着隐藏列DATA_POLL_PTR指针,找到上一个有效的历史记录(有效的记录:该记录对当前事务可见,且DELETE_BIT=0)。

从上面可以知道:实际上RC和RR级别的操作基本相同,而不同之处在于:行记录对于当前事务的可见性(可见性:即哪个版本的行记录对这个事务是可见的)。RC级别对数据的可见性是该数据的最新记录,RR基本对数据的可见性是事务开始时,该数据的记录。

1) 行记录的可见性(read_view)的实现

在innodb中,创建一个事务的时候,会将当前系统中的活跃事务列表创建一个副本(read_view),里面存储着的都是在当前事务开始时,还没commit的事务,这些事务里的值对当前事务不可见。read_view中有两个关键值 up_limit_id(当前未提交事务的最小版本号-1,在up_limit_id之前的事务都已经提交,在up_limit_id之后的事务可能提交,可能还没提交) 和 low_limit_id(当前系统尚未分配的下一个事务id,也就是目前已出现过的事务id的最大值+1。注意:low_limit_id不是最大的活跃事务的id。)

注意:当前事务和正在commit的事务是不在read_view中的。

2)无论是RC级别还是RR级别,其判断行记录的可见性的逻辑是一样的。

当该事务要读取undo中的行记录时,会将行记录的版本号(DB_TRX_ID)与read_view进行比较:

1. 如果DB_TRX_ID小于up_limit_id,表示该行记录在当前事务开始前就已经提交了,并且DELETE_BIT=0,则该行记录对当前事务是可见的。

2. 如果DB_TRX_ID大于low_limit_id,表示该行记录在所在的事务在本次事务创建后才启动的,所以该行记录的当前值不可见。

3. 如果up_limit_id< = DB_TRX_ID <= low_limit_id,判断DB_TRX_ID是否在活跃事务链中,如果在就是不可见,如果不在就是可见的。

4. 如果上面判断都是不可见的,则读取undo中该行记录的上一条行记录,继续进行判断。

而对于RC级别的语句级快照和RR级别的事务级快照的之间的区别,其实是由read_view生成的时机来实现的。RC级别在执行语句时,会先关闭原来的read_view,重新生成新的read_view。而RR级别的read_view则只在事务开始时创建的。所以RU级别每次获取到的都是最新的数据,而RR级别获取到的是事务开始时的数据。

3)值得注意的是: 在上面的可见性判断中,虽然逻辑是一样的,但是实际意义上是有区别的:

在第二步中,对于RC级别来说,low_limit_id是执行语句时已出现的最大事务id+1,可以认为在执行语句时,是不存在事务会比low_limit_id要大,所以大于low_limit_id的事务都是不可见的。而对于RR级别来说,low_limit_id是当前事务开始时已出现的最大事务+1(也可以认为是当前事务的id+1,因为在创建当前事务时,当前事务的id最大),大于low_limit_id的事务表示是在该事务开始后创建的,所以对RR级别是不可见。

在第三步中,对于RC级别来说,只要DB_TRX_ID不在活跃链表中,则无论DB_TRX_ID是否大于事务id,RC都是可见的。而对于RR级别来说,因为low_limit_id就是当前事务id+1,可以认为小于low_limit_id的事务都是在当前事务创建前出现的,所以也只需要简单判断DB_TRX_ID是否在活跃链表中。

串行化(serializable):读写都会加锁。

(四)Mysql中的锁

锁分类

Mysql为了解决事务并发,数据安全问题,使用了锁机制。

按照锁的粒度可以把锁分为表级锁和行级锁:

1) 表级锁

Mysql中粒度最大的一种锁,会锁住当前操作的整张表,并发性能低,但表锁的实现简单,耗费资源少,加锁快,不会出现死锁。

2) 行级锁

Mysql中粒度最小的一种锁,只会锁住当前操作的数据行。行锁极大地提高了Mysql的并发性能,但行锁的开销较大,速度较慢,会出现死锁。

按照锁的性质可以把锁分为共享锁和排它锁:

1) 共享锁(S锁)

其他事务可以读取被共享锁锁住的数据行,不能修改该数据行,并且也只能对该数据行加共享锁,而不能加排它锁。

2) 排它锁(X锁)

当一个事务对数据行加上排他锁,那么该事务可以读取和修改该数据行,而其他事务不允许对该数据行加任何锁。

表锁

Mysql中表锁除了共享锁和排他锁之外,还存在着两种锁:意向共享锁(IS),意向排他锁(IX)。

意向锁的作用是表明该事务想对该表加一个共享/排他锁,但并没有真正把锁加上去。比如,当事务想对一个被排他锁锁住的表加上共享锁/排他锁时,必须先在该表上添加一个意向共享锁/意向排他锁,直到锁住表的排他锁被释放。

事务在给一个数据行加共享锁前必须先取得该表的IS锁,在加排它锁前必须先取得该锁的IX锁。并且意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。

行锁

InnoDB行锁是通过给索引上的索引项加锁来实现的,这意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

Innodb中的行级锁有以下几种:

1) Record Lock: 对索引项加锁,锁定符合条件的行。其他事务不能修改和删除加锁项;

2) Gap Lock: 对符合条件范围的“间隙”加锁,锁定记录的范围,不包含索引项本身。其他事务不能在锁范围内插入数据。“间隙(GAP)”是指 键值在条件范围内但并不存在的记录。

3) Next-key Lock: 锁定索引项本身和间隙。Record Lock和Gap Lock的结合,Next-key Lock就是我们所说的间隙锁,可解决幻读问题。

举例来说,假如emp表中只有101条记录,其empid的值分别是 1,2,...,100,101,下面的SQL:

Select * from  emp where empid > 100 for update;

是一个范围条件的检索,InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的“间隙”加锁。

在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入。

注意

1) InnoDB 存储引擎在 REPEATABLE-READ(可重读) 事务隔离级别下使用的是Next-Key Lock 锁,解决的幻读的问题,因此InnoDB 引擎的默认的隔离级别 REPEATABLE-READ(可重读) 已经达到了SQL标准的 SERIALIZABLE(可串行化) 隔离级别,并且事务不需要串行化。

2) 当查询的索引含有唯一属性时,将next-key lock降级为record key。

3) Innodb中行级锁是加在索引上,所以只有使用索引时,才会加行锁,否则只会加表锁。但这并不意味着,只要使用了索引就会加行级锁,如果MySQL认为全表扫描效率更高,比如对一些很小的表或者索引范围包括大部分表数据,它就不会使用索引,这种情况下InnoDB将使用表锁,而不是行锁。

死锁

 不同于MyISAM总是一次性获得所需的全部锁,InnoDB的锁是逐步获得的,当两个事务都需要获得对方持有的锁,导致双方都在等待,这就产生了死锁。 发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个则可以获取锁完成事务,我们可以采取以上方式避免死锁:

1) 通过表级锁来减少死锁产生的概率;

2) 多个程序尽量约定以相同的顺序访问表;

3 )同一个事务尽可能做到一次锁定所需要的所有资源。

 

 

 

 

深入解析MySQL事务隔离级别及其实现原理 在数据库管理系统中,事务(Transaction)是保证数据一致性的重要机制。而事务隔离级别则是决定多个事务之间如何相互影响的关键。MySQL作为常用的关系型数据库,其事务隔离级别和实现机制在许多业务场景中起着至关重要的作用。本文将详细介绍MySQL的事务隔离级别、常见问题及其底层实现原理,帮助读者更好地理解和应用事务。 阅读详情

相关推荐

Manus通用AI智能体完全使用指南(2025最新版)——从注册到高阶技巧全解析

Manus通用AI智能体完全使用指南(2025最新版)——从注册到高阶技巧全解析

m0_69718028的博客 8113

MySQL事务隔离原理(四种隔离级别的具体实现)

一、事务的定义 以下所说的事务都是指在InnoDB引擎下,因为MyISAM引擎是不支持事务的(这也是 MyISAM 被 InnoDB 取代的重要原因之一)。 事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单元。 事务的开始与结束可以由用户显式控制。如果用户没有显式地定义事务,则由数据库管理系统默认规定自动划分事务。在SQL中,定义事务的语句一般有三条: BEGIN TRANSACTION; COMMIT; ROLLBACK; 事务通常以BEGIN TRANSACTI

kking_edc的博客 1万+

LVGL按键触发回调函数的完整流程

如果是我的话我会怎么写:例如按键,我先定义一个结构体里面包含ID,事件名等和回调函数的链表节点结构体里面有具体函数的指针,也有指向下一个回调函数的链表节点的指针,初始化一个结构体变量的,通过BSP层来驱动触摸屏幕,再通过中间层与被按下时就会判断是长按还是短按还是其他,改变变量的事件例如:改成长按,生成事件包后再注册你长按的回调函数链表节点,再根据变量的事件到链表中遍历最后实现功能.父容器监听所有子列表项的点击事件,无需为每个列表项单独注册回调。的回调,打印所有事件日志,观察事件触发顺序。

solomonzw的博客 3238

mysql隔离级别及实现原理

读未提交,它是性能最好,也可以说它是最野蛮的方式,因为它压根儿就不加锁,所以根本谈不上什么隔离效果,可以理解为没有隔离。串行化,读的时候加共享锁,也就是其他事务可以并发读,但是不能写;写的时候加排它锁,其他事务不能并发写也不能并发读。读已提交是通过MVCC+快照读实现的,每次执行语句的时候都要重新创建一次快照。可重复读是通过MVCC+快照读实现的,仅在事务开启的时候创建一次快照。并发更新:行锁解决了并发更新的问题。

weixin_43653230的博客 1607

Synopsys AXI VIP 从环境搭建到首个验证场景运行

本文详细介绍了Synopsys AXI VIP从环境搭建到首个验证场景运行的全过程,包括VIP安装、示例工程生成、验证环境解析、仿真调试技巧及进阶优化。特别针对AXI协议验证中的常见问题提供了实用解决方案,帮助工程师快速掌握这一SoC验证必备工具。

weixin_29185493的博客 340

RuoYi(分离版) 使用代码生成器添加子模块(idea版)

文章目录准备一、使用代码生成器1.数据库2.导入表并生成代码二、导入代码文件1.新建一个模块2.导入zip代码文件3.模块环境配置添加菜单和访问地址总结 准备 前提要把系统启动起来,部分教程可以参考这边文章若依框架RuoYi前后端分离项目导入IDEA及运行启动 但是完全参考这篇文章还是不能把项目启动起来,因为这篇文章没有说明数据库。 我是用的是本地数据库,采用xampp+Navicat的组合来部署和访问数据库。打开Navicat,连接并创建数据库ry-vue并导入数据脚本ry_20191008.sql,q

dream_coke的博客 1万+

MySQL事务隔离级别和实现原理(看这一篇文章就够了!

而在事务A提交之前,事务B也想 update 这行数据,于是申请行锁,但是由于已经被事务A占有,事务B是申请不到的,此时,事务B就会一直处于等待状态,直到事务A提交,事务B才能继续执行,如果事务A的时间太长,那么事务B很有可能出现超时异常。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现好像刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户感觉很魔幻,感觉出现了幻觉,这就叫幻读。..

m0_70556273的博客 1108

Altium Designer 16安装教程(Windows11、小白教程)

Altium Designer 16在Windows11中的超详细安装教程

qq_47003770的博客 1万+

mysql四种隔离级别以及原理

mysql四种隔离级别原理

SUNZHONGWU5234的博客 1189

ardupilot 获取避障传感器数据

本节主要记录自己学ardupilot的避障代码过程,首先看下怎么注册避障传感器,然后怎么获取避障数据。

陌城烟雨 5524

华为OD机考双机位C卷 - 打印机队列 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 打印机队列

算法大师! 4619

数据库事务的四个隔离级别及MySQL实现

数据库事务的四个隔离级别及MySQL实现 1、事务的定义: 数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。 2、事务的特性(ACID特性): 1)原子性(Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全...

Lee_JH2018的博客 1046

【ESP32设备通信】-两个ESP32间UART通信

在本文中,我们将使用 Arduino IDE 的 UART 硬件库在两个 ESP32 板之间执行 UART 或串行通信。 要使用 USB 端口调试和编程 ESP32,需要使用称为通用异步接收器/发送器 (UART) 通信的串行端口。 对于大多数传感器和系统,主要的通信方法被认为是 UART。 为了共享工作负载、信息和执行不同的任务,有时需要在两个 ESP32 开发板之间进行通信。

视觉与物联智能 2991

MySQL的四个隔离级别是如何实现的

1. 读未提交 所有的读不加锁,读到的数据都是最新的数据,性能最好 所有的写加行级锁,写完就立即释放,不等事务结束 2. 读已提交 使用的是MVCC技术 写操作:加行级锁,事务开始后,会添加一条undo记录。数据行的隐藏列有指向undo记录的指针 读操作:不加锁,在读取时,如果该行被其他事务锁定,则顺着隐藏列上undo指针,找到上一个有效的历史记录。(有效记录:该记录对当前事务可见,且DELETE_BIT=0) 3. 可重复读 也是使用MVCC技术,读写操作跟上面几乎一样 区别是读已提交每次读

weixin_44390164的博客 169

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Mysql的四个隔离级别是如何实现的 (简要)

分别是原子性、一致性、隔离性、持久性。原子性:undolog日志来保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行的sql。一致性:是由其他三大特性保证隔离性:MVCC来保证,多版本并发控制持久性:由redolog来保证,mysql修改数据的时候会在redolog中记录一份日志数据,就算数据没有保存成功,只要日志保存成功了,数据依然不会丢失。MySQL崩溃恢复功臣—Redo Log脏读:事务A读取到了事务B中未提交的数据,当事务B回滚后,事务A读取到的数据都是脏数据。不可重复读:事务A多次读取同一数

赵睿宇的博客 2166

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

MySQL事务隔离级别详解

全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。解决幻读的方式有很多,但是它们的核心思想就是一个事务在操作某张表数据的时候,另外一个事务不允许新增或者删除这张表中的数据了。从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。还是刚才上面的读已提交的图,虽然避免了读未提交,但是却出现了,一个事务还没有结束,就发生了 不可重复读问题。并不会有任何性能损失。

2301_79438104的博客 821

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MySQL事务隔离级别是怎么实现的?

原:要么全部昨晚,要么都不做一:事务操作前后,数据有完整的约束,数据库保持一致性状态隔:数据库运行并发事务同时对数据进行读写修改,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致久:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。InnoDB 引擎通过什么技术来保证事务的这四个特性的呢?

2401_86272716的博客 974

数据库——不同的隔离级别分别是如何实现的

数据库通过锁、MVCC、快照隔离等技术在不同隔离级别间权衡性能与一致性。低级别(如读未提交)偏向性能优化,高级别(如串行化)通过严格机制保证一致性。实际应用中需根据业务需求选择合适的隔离级别。数据库的事务隔离级别通过不同的并发控制机制实现,以平衡数据一致性和性能。

z17826856787的博客 903

MySQL高频八股:并发事务与事务隔离级别

今天继续来写MySQL的高频八股,在MySQL中,如果多个并发事务对同一条数据进行操作,可能会带来几个问题——脏读、不可重复读、幻读,为了解决这些问题,MySQL的事务隔离级别就派上用场了。这篇文章重点介绍事务隔离级别以及它的实现原理。

weixin_49426115的博客 889

mysql事务隔离级别举例_mysql事务隔离级别举例

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。Read Uncommitted(读取未提交内容)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。Read ...

weixin_34049168的博客 88

Mysql 事务隔离级别是怎么实现的?

在一个事务内多次查询某个符合查询条件的记录数量,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了幻读。在一个事务内多次读取一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了不可重复读的情况.指一个事务执行过程中看到的数据,一直跟启动时看到的数据是一致的,Mysql InnoDB的默认隔离级别。会对记录加上读写锁,当多个事务对这条记录进行读写时,后来的事务要等先来的事务完成才能继续执行。事务是由Mysql的引擎来实现的,我们常见的innoDB引擎它是支持事务的。

chichengfeng1的博客 328

(MySQL高频面试题)事务隔离级别有哪些?默认级别是什么?

可重复读(Repeatable Read):在可重复读隔离级别下,事务在整个执行周期内,多次读取同一数据所得到的结果始终保持一致。它的实现原理是:在事务首次执行查询时生成 Read View,并在后续的查询过程中复用该 View,同时结合间隙锁,以此来防范因其他事务执行插入操作而导致的幻读问题。这种隔离级别特别适用于那些对事务内数据一致性要求极高的场景,例如银行对账系统中多次读取账户余额的操作,确保在同一个事务内,数据读取结果的稳定性和一致性。一般来说,存在四个主要的事务隔离级别:​。

2401_87145357的博客 402

1.13 从MySQL事务隔离级别开始

select查询是通过**MVCC(多重)**实现的,在MVCC实现中,每条记录都会有一个版本号,启动时读取了哪个版本号,过程中会一直看开始时候的版本号,从而保证了事务的隔离级别。可重复读隔离级别是在开启事务之后,执行一条select语句之后,生成一个Read View,后续事务查询数据都复用这个Read View,所以保证了事务期间多次读到的数据是一致的。脏读是一个事务读到了另一个未提交事务修改过的数据,如果另外一个事务回滚了,刚才读到的数据就和数据库里面的数据不一样了。可重复读避免了脏读和不可重复读。

xzc的博客 341

mysql隔离级别 简书_MySQL事务隔离级别和实现原理,看这一篇就够了!!!

MySQL事务隔离级别和实现原理(看这一篇文章就够了!)经常提到数据库的事务,那你知道数据库还有事务隔离的说法吗,事务隔离还有隔离级别,那什么是事务隔离,隔离级别又是什么呢?本文就帮大家梳理一下。MySQL 事务本文所说的 MySQL 事务都是指在 InnoDB 引擎下,MyISAM 引擎是不支持事务的。数据库事务指的是一组数据操作,事务内的操作要么就是全部成功,要么就是全部失败,什么都不做,其实...

weixin_35696112的博客 137
上一篇: Redis对过期数据的淘汰策略
QEcode
博客等级 码龄10年 39粉丝 147原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值