首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql-3-事务隔离级别

Mysql-3-事务隔离级别

原创
作者头像
Get
发布于 2024-03-10 13:01:52
发布于 2024-03-10 13:01:52
1790
举报

4种隔离级别详解:MySQL-InnoDB-默认隔离级别为可重复读(RR)。

https://mp.weixin.qq.com/s/iFmvvt4DJ-_qFeb0XUh6QA

事务并发执行时,不考虑事务的隔离性,会产生数据不一致情况,为了解决数据不一致问题,就采用锁机制。

代码语言:java
AI代码解释
复制
详解:
1、读未提交:"指一个事务还没提交时,它做的变更就能被其他事务看到",会产生脏读、幻读、不可重复读。
            所有事务都可以看到其他未提交事务的执行结果
			   比如同一时间有两个事物,一个正在修改,一个正在查询,查询的可以查看到正在修改的数据。若修改事物回滚,则查询的结果就是错误的。
2、读已提交:"指一个事务提交之后,它做的变更才能被其他事务看到",会产生幻读、不可重复读。
           一个事物只能看见其他已经提交的事物所做的改变
           两个并发的事务,“事务1:小明消费”、“事务2:小红网上转账”,事务1事先读取了数据,事务2紧接了更新了数据,并提交了事务,
           而事务1再次读取该数据时,数据已经发生了改变。
3、可重复读:"指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的",会产生幻读。
            若同一事物修改数据,会产生两次读取数据结果不一致问题。
            当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时会读取到包括刚插入的数据。
            如小红查小明信用卡消费金额为50元,而小明此时正好买东西花了1000元,随后小红将小明当月的信用卡消费明细打印出来,却发现消费总额为1050元,
            小红很诧异,以为是出现了幻觉。
4、串行化:"会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行"
		    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决不读脏,可重复读,不可幻读。
			简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争,并发性能最差,在分布式事务中可能会被用到


1、脏读:"是指一个事务能读取其他事务未提交的数据"
2、不可重复读:"同一事务先后读取同一条数据,但前后两次读到的数据是不一致的。(强调update 针对单行)"
              一个事务在前后两次读取某个数据时,发现前后两次读到的数据是不一致的(数据发生了修改),这种现象叫做“不可重复读”。 
3、幻读:"同一事务先后读取一个范围的记录,但两次读取的纪录数不同。(强调insert或delete,范围查询)"
        指的是在一个事务执行过程中,读取到了其他事务新插入数据,导致两次读取的结果不一致 。
        一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读” 。
4、丢失更新:"撤销一个事务时,把其他事务已提交的更新数据覆盖"
    	   (事务AB并发执行事物,A事务执行更新后,提交;B事务在A事务更新后,B事务结束前也做了对该行数据的更新操作,然后回滚,则两次更新操作都丢失了)
"不可重复读和幻读的区别:可重复读是读到的是其他事务修改或者删除的数据,而幻读读到的是其它事务新插入的数据"
无论是脏读,不可重复读,还是幻读,它们都属于数据库的读一致性的问题,都是在一个事务里面前后两次读取出现了不一致的情况。
| 隔离级别          | 脏读 | 不可重复读  | 幻读 |
| ---------------- | ---- | ---------- | ---- |
| Read uncommitted ||||
| Read committed   |  ×   |||
| Repeatable read  |  ×   |	    × 	   ||
| Serializable 	   |  ×   | 	×	   |  ×   |
数据库的事务隔离越严格,并发副作用就越小,但付出的代价也就越大,
因为事务隔离本质上就是使事务在一定程度上串行化,需要根据具体的业务需求来决定使用哪种隔离级别。
代码语言:java
AI代码解释
复制
4种事务隔离级别:
1、读未提交(read uncommitted):会产生脏读、幻读、不可重复读。
2、读已提交(read committed):会产生幻读、不可重复读。
3、可重复读(repeatable read):会产生幻读。
4、串行化(serializable):不产生,但效率低下

事务不同隔离级别会产生3种数据不一致情况:
1、脏读:读到其他事务未提交的数据;
2、不可重复读:前后读取的数据不一致; 
3、幻读:前后读取的记录数量不一致。

注释:InnoDB在可重复读的级别就已经解决了幻读的问题,这也是InnoDB使用可重复读作为默认隔离级别的原因。
InnoDB 引擎的默认隔离级别是「可重复读」,
InnoDB 通过next-key lock 锁(行锁和间隙锁的组合)来锁住记录之间的"间隙"和记录本身,
       防止其他事务在这个记录之间插入新的记录,这样就避免了幻读现象。

四种隔离级别具体是如何实现的呢?
1、读未提交:因为可以读到未提交事务修改的数据,所以直接读取最新的数据就好了;
2、读已提交:通过 Read View 来实现的,隔离级别是在读取每个数据前都生成一个 Read ViewMVCC);
3、可重复读:通过 Read View 来实现的,隔离级别是启动事务时生成一个 Read View,然后整个事务期间都在用这个 Read ViewMVCC)。
4、串行化:  通过加读写锁的方式来避免并行访问;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL8.0基础教程 - 事务隔离级别解决之道
隔离性是事务的基本特性之一,它可以防止数据库在并发处理时出现数据不一致的情况。最严格的情况下,我们可以采用串行化的方式来执行每一个事务,这就意味着事务之间是相互独立的,不存在并发的情况。然而在实际生产环境下,考虑到随着用户量的增多,会存在大规模并发访问的情况,这就要求数据库有更高的吞吐能力,这个时候串行化的方式就无法满足数据库高并发访问的需求,我们还需要降低数据库的隔离标准,来换取事务之间的并发能力。
JavaEdge
2020/05/27
1.1K0
技术篇:数据库的事务隔离级别
事务前后数据的完整性必须保持一致。比如A向B转账,A扣100元,B收到100元,符合逻辑运算。
伊泽瑞尔
2022/06/01
2180
带你了解MySQL事务隔离级别
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
友儿
2022/09/11
2090
InnoDB中的事务隔离级别与锁
一个事务在进行数据变更时对另一个事务产生的可见性影响描述,表达为 脏读、幻读、不可重复读三个概念。下面具体解释下对应概念。
知一
2021/12/07
7500
InnoDB中的事务隔离级别与锁
美团一面,四种事务隔离级别分别是怎么实现的?
前面其实单独写过事务隔离级别和 MVCC 的文章,但是感觉仍然没法把知识串起来,今天正好借着这道面试题来巩固一下知识体系,虽然文章比较长,不过都是大伙熟悉的知识,帮助大家理清思路而已~
飞天小牛肉
2022/02/23
9220
美团一面,四种事务隔离级别分别是怎么实现的?
MySQL事务隔离级别详解
SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。 Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。 Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是
wangxl
2018/03/08
1.5K0
MySQL事务隔离级别详解
在?MySQL事务隔离级别了解一下?
事务的四大ACID 属性:Atomicity 原子性、Consistency 一致性、Isolation 隔离性、Durability 持久性。
编程大道
2019/07/19
2580
详解MySQL隔离级别
在不同隔离级别下,事务A会有哪些不同的返回结果,也就是图中的V1、V2、V3的返回值分别是什么。
用户10384376
2023/02/26
9900
详解MySQL隔离级别
面试题-Mysql事务隔离级别
Mysql有四种隔离级别,这些隔离级别用来限定哪些是可见的,哪些是不可见的,隔离级别越低并发越高,Mysql中默认的隔离级别是可重复读,下面我们来一一介绍下这四种隔离级别。
别明天就今天吧
2020/09/07
6180
MySQL事务(一)MySQL事务隔离级别、锁机制
数据库通常会同时执行多个事务,这些事务可能同时对同一批数据进行增删改查操作,可能会导致脏写、脏读、不可重复读和幻读等问题。
鳄鱼儿
2024/05/21
1.6K0
MySQL事务(一)MySQL事务隔离级别、锁机制
MySQL 事务特性和事务隔离级别
MySQL 事务具有四个特性:原子性、一致性、隔离性、持久性,这四个特性简称 ACID 特性
很酷的站长
2022/12/16
7040
MySQL 事务特性和事务隔离级别
数据库的事务隔离级别总结[通俗易懂]
学习数据库的时候常常会接触到事务, ACID等概念,那么到底什么是数据库的事务,数据库事务又具有哪些特点,和ACID有怎样的关系,事务的隔离级别又是做什么的呢?。
全栈程序员站长
2022/08/27
7010
数据库的事务隔离级别总结[通俗易懂]
事务隔离级别
  MySQL是一个 客户端/服务器 架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每 个客户端与服务器连接上之后,就可以称为一个会话( Session )。每个客户端都可以在自己的会话中 向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理 多个事务。事务有 隔离性 的特性,理论上在某个事务 对某个数据进行访问 时,其他事务应该进行 排 队 ,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样对 性能影响太大 ,我们既想保持 事务的隔离性,又想让服务器在处理访问同一数据的多个事务时 性能尽量高些 ,那就看二者如何权衡取 舍了。
一个风轻云淡
2022/11/15
8700
事务隔离级别
惊!MySQL事务隔离级别原来这么简单
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务的使用是数据库管理系统区别文件系统的重要特征之一。
黑洞代码
2021/01/14
5040
惊!MySQL事务隔离级别原来这么简单
mysql事务隔离级别
在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
CodingCode
2021/09/23
1.5K0
mysql事务隔离级别
一文带你轻松搞懂事务隔离级别(图文详解)
事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。
Java技术江湖
2019/09/25
3800
一文带你轻松搞懂事务隔离级别(图文详解)
Mysql事务隔离级别
在所有事物中可以看到事物没有提交的结果,实际应用中是很少的,他的性能也不比其他隔离级别好很多,读到未提交的结果导致脏读
小土豆Yuki
2020/08/28
1.5K0
MySQL的四种事务隔离级别
本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB
Lansonli
2021/10/09
5480
MySQL的四种事务隔离级别
事务隔离机制原理深入分析以及MySQL不同隔离级别分场景下实验对比
这是我总结的事务的四种隔离机制,比较好理解,主要是有些地方文字游戏说不清楚很容易混淆:ReadUn数据库
Java架构师必看
2020/04/16
1.4K0
快速理解 MySQL 事务隔离级别
在这个例子中根本不存在 id 为 1,并且 age 为 21 的记录,事务1读到了脏数据。
dys
2019/03/07
4510
相关推荐
MySQL8.0基础教程 - 事务隔离级别解决之道
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档