iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Mysql事务隔离级别原理实例解析
  • 390
分享到

Mysql事务隔离级别原理实例解析

Mysql事务隔离级别 2022-05-29 22:05:31 390人浏览 安东尼
摘要

引言 大家在面试中一定碰到过 说说事务的隔离级别吧? 老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!因为他们对可重复读(Repeata

引言

大家在面试中一定碰到过

说说事务的隔离级别吧?

老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!因为他们对可重复读(Repeatable Read)和串行化(serializable)的解析实在是看的我一头雾水!

再加上很多书都说可重复读解决了幻读问题,比如《Mysql技术内幕--innodb存储引擎》等,不一一列举了,因此网上关于事务隔离级别的文章大多是有问题的,所以再开一文说明!

本文所讲大部分内容,皆有官网作为佐证,因此对本文内容你可以看完后,你完全可以当概念记在脑海里,除非官网的开发手册是错的,否则应当无误!

另外,本文会重点说一下

可重复读(Repeatable Read)是否真的解决幻读的问题!

正文

开始我先提一下,根据事务的隔离级别不同,会有三种情况发生。即脏读、不可重复读、幻读。这里我先不提这三种情况的定义,后面在讲隔离级别的时候会补上。

这里,大家记住一点,根据脏读、不可重复读、幻读定义来看(自己总结,官网没有),有如下包含关系:


那么,这张图怎么理解呢?

即,如果发生了脏读,那么不可重复读和幻读是一定发生的。因为拿脏读的现象,用不可重复读,幻读的定义也能解释的通。但是反过来,拿不可重复读的现象,用脏读的定义就不一定解释的通了!

假设有表tx_tb如下,pId为主键

pId name
1 zhangsan

读未提交(READ_UNCOMMITTED)

其实这个从隔离名字就可以看出来,一个事务可以读到另一个事务未提交的数据!为了便于说明,我简单的画图说明!

如图所示,一个事务检索的数据被另一个未提交的事务给修改了。

官网对脏读定义的地址为

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_dirty_read

其内容为

**dirty read
An operation that retrieves unreliable data, data that was updated by another transaction but not yet committed.
**

翻译过来就是

检索操作出来的数据是不可靠的,是可以被另一个未提交的事务修改的!

你会发现,我们的演示结果和官网对脏读的定义一致。根据我们最开始的推理,如果存在脏读,那么不可重复读和幻读一定是存在的。

读已提交(READ_COMMITTED)

这个也能看的出来,一个事务能读到另一个事务已提交的数据!为了便于说明,我简单的画图说明!

如图所示,一个事务检索的数据只能被另一个已提交的事务修改。

官网对不可重复读定义的地址为

Https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_non_repeatable_read

其内容为

**non-repeatable read
The situation when a query retrieves data, and a later query within the same transaction retrieves what should be the same data, but the queries return different results (changed by another transaction committing in the meantime).
**

翻译过来就是

一个查询语句检索数据,随后又有一个查询语句在同一个事务中检索数据,两个数据应该是一样的,但是实际情况返回了不同的结果。!

ps:作者注,这里的不同结果,指的是在行不变的情况下(专业点说,主键索引没变),主键索引指向的磁盘上的数据内容变了。如果主键索引变了,比如新增一条数据或者删除一条数据,就不是不可重复读。

显然,我们这个现象符合不可重复读的定义。下面,大家做一个思考:

这个不可重复读的定义,放到脏读的现象里是不是也可以说的通。显然脏读的现象,也就是**读未提交(READ_UNCOMMITTED)**的那个例子,是不是也符合在同一个事务中返回了不同结果!但是反过来就不一定通了,一个事务A中查询两次的结果在被另一个事务B改变的情况下,如果事务B未提交就改变了事务A的结果,就属于脏读,也属于不可重复读。如果该事务B提交了才改变事务A的结果,就不属于脏读,但属于不可重复读。3、可重复读(REPEATABLE_READ)

这里,我改变一下顺序,先上幻读的定义

官网对幻读定义的地址为

https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_phantom

phantom
A row that appears in the result set of a query, but not in the result set of an earlier query. For example, if a query is run twice within a transaction, and in the meantime, another transaction commits after inserting a new row or updating a row so that it matches the WHERE clause of the query.

翻译过来就是

在一次查询的结果集里出现了某一行数据,但是该数据并未出现在更早的查询结果集里。例如,在一次事务里进行了两次查询,同时另一个事务插入某一行或更新某一行数据后(该数据符合查询语句里where后的条件),并提交了!

好了,接下来上图,大家自己评定该现象是否符合幻读的定义

显然,该现象是符合幻读的定义的。同一事务的两次相同查询出现不同行。下面,大家做一个思考:

这个幻读的定义,放到不可重复读的现象里是不是也可以说的通。大家自行思考!反过来就不一定通了。事务第二次查询出了一个数据,但是该数据并未出现在第一次查询的结果集里。如果该数据是修改数据,那么该现象既属于不可重复读,也属于幻读。如果该数据是新增或删除的数据,那该现象就不属于不可重复读,但属于幻读。

接下来说一下,为什么很多文章都产生误传,说是可重复读可以解决幻读问题!原因出自官网的一句话
(地址是:https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-record-locks)

原文内容如下

By default, InnoDB operates in REPEATABLE READ transaction isolation level. In this case, InnoDB uses next-key locks for searches and index scans, which prevents phantom rows (see Section 14.7.4, “Phantom Rows”).

按照原本这句话的意思,应该是

InnoDB默认用了REPEATABLE READ。在这种情况下,使用next-key locks解决幻读问题!

结果估计,某个国内翻译人员翻着翻着变成了

InnoDB默认用了REPEATABLE READ。在这种情况下,可以解决幻读问题!

然后大家继续你抄我,我抄你,结果你懂的!

显然,漏了"使用了next-key locks!"这个条件后,意思完全改变,我们在该隔离级别下执行语句

select * from tx_tb where pId >= 1;

是快照读,是不加任何的,根本不能解决幻读问题,除非你用

select * from tx_tb where pId >= 1 lock in share mode;

这样,你就用上了next-key locks,解决了幻读问题!

串行读(SERIALIZABLE_READ)

在该隔离级别下,所有的select语句后都自动加上lock in share mode。因此,在该隔离级别下,无论你如何进行查询,都会使用next-key locks。所有的select操作均为当前读!


OK,注意看上表红色部分!就是因为使用了next-key locks,innodb将PiD=1这条索引记录,和(1,++∞)这个间隙锁住了。其他事务要在这个间隙上插数据,就会阻塞,从而防止幻读发生!

有的人会说,你这第二次查询的结果,也变了啊,明显和第一次查询结果不一样啊?对此,我只能说,请看清楚啊。这是被自己

的事务改的,不是被其他事物修改的。这不算是幻读,也不是不可重复读。

总结

上面罗里吧嗦一大堆,最后来一个表格做总结吧,你面试答这个表就行。上面的一切是为了这张表做准备!

隔离级别 脏读 不可重复读 幻读
读未提交
不可重复读
可重复读
串行化

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。

您可能感兴趣的文档:

--结束END--

本文标题: Mysql事务隔离级别原理实例解析

本文链接: https://www.lsjlt.com/news/9512.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Mysql事务隔离级别原理的示例分析
    这篇文章主要介绍Mysql事务隔离级别原理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!说说事务的隔离级别吧?老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问...
    99+
    2024-04-02
  • Mysql案例刨析事务隔离级别
    目录1. 理论SERIALIZABLEREPEATABLE READREAD COMMITTEDREAD UNCOMMITTED2. SQL 实践2.1 查看隔离级别2.2 READ...
    99+
    2024-04-02
  • mysql事务和隔离级别底层原理浅析
    目录前言一、事务底层原理浅析原子性:持久性隔离性:一致性:二、隔离级别底层原理浅析三、总结前言 首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一...
    99+
    2024-04-02
  • MySQL事务隔离级别的示例分析
    这篇文章将为大家详细讲解有关MySQL事务隔离级别的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内...
    99+
    2024-04-02
  • MySQL事务隔离级别详解
    一、什么是事务? 事务是逻辑上的一组操作,要么全执行,要么全不执行。 事务最经典栗子也经常被拿出来的栗子就是银行转账了。比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这...
    99+
    2023-08-30
    mysql
  • 如何浅析mysql事务和隔离级别底层原理
    本篇文章给大家分享的是有关如何浅析mysql事务和隔离级别底层原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言首先回顾一下什么是事务,事务是数据库操作的最小工作单元,是作...
    99+
    2023-06-21
  • 【MySQL】事务及其隔离性/隔离级别
    需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云-->阿里云-->华为云 show variables like 'autocommit';+---------------+-------+| Variable_name...
    99+
    2023-09-01
    mysql 数据库
  • mysql事务隔离的级别
    这篇文章主要介绍“mysql事务隔离的级别”,在日常操作中,相信很多人在mysql事务隔离的级别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql事务隔离的级别”的疑惑...
    99+
    2024-04-02
  • MySQL核心技术原理之:MySQL事务隔离级别与原理
    作者:禅与计算机程序设计艺术 1.简介 随着互联网的飞速发展,网站的并发访问量越来越大,数据库的事务处理能力要求也越来越高。在这种情况下,如果应用服务器直接对数据库进行操作,可能会出现资源竞争、数据...
    99+
    2023-10-20
    大数据 人工智能 语言模型 Java Python 架构设计
  • 如何理解MySQL中的事务隔离级别
    这篇文章给大家介绍如何理解MySQL中的事务隔离级别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。很多小伙伴对 MySQL 的隔离级别一直心存疑惑,其实这个问题一点都不难,关键看怎么讲...
    99+
    2024-04-02
  • mysql事务隔离级别详情
    serializable 串行化(无问题) 事务必须以顺序的方式执行,前一个事务提交之前后面的事务无法进行提交,最安全,但是不能并发操作,导致效率低下. repeatab re...
    99+
    2024-04-02
  • 事务隔离级别通俗指南:轻松理解不同隔离级别
    事务隔离级别是数据库管理系统中用于保证事务正确执行的一项重要机制。它通过控制并发事务对共享数据的访问,来确保每个事务都能独立、正确地执行。事务隔离级别分为四个级别:读未提交、读已提交、可重复读和串行化。 读未提交(Read Uncommi...
    99+
    2024-02-23
    事务隔离级别 并发控制 数据库管理系统
  • 深入理解MySQL事务的4种隔离级别
    目录1 简介2 什么是数据库事务?2.1 事务的四大特性(ACID)3 并发事务会导致的问题3.1 本文会使用到的 SQL 语句3.1.1 示例表结构3.1.2 查询事务的默认隔离级...
    99+
    2024-04-02
  • Mysql事务隔离级别之读提交的示例分析
    这篇文章主要为大家展示了“Mysql事务隔离级别之读提交的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Mysql事务隔离级别之读提交的示例分析”这篇文...
    99+
    2024-04-02
  • MySQL的事务隔离级别介绍
    本篇内容介绍了“MySQL的事务隔离级别介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是事务?数据...
    99+
    2024-04-02
  • MySQL有哪些事务隔离级别
    MySQL有哪些事务隔离级别,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。数据库事务有四种隔离级别:未提交读(Read Unc...
    99+
    2024-04-02
  • MYSQL事务的隔离级别与MVCC
    目录前言1. 事务(transaction)的起源1.1. 事务的定义1.2. 哪些存储引擎支持事务2. MySQL的事务语法2.1. 自动提交2.2. 手动操作事务2.2.1. 开...
    99+
    2024-04-02
  • MySQL事务隔离级别有哪些
    这篇文章给大家介绍MySQL事务隔离级别有哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。说说事务的隔离级别吧老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前...
    99+
    2024-04-02
  • MySQL中隔离级别的示例分析
    这篇文章主要介绍MySQL中隔离级别的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL入门--事务隔离级别1) 隔离级别介绍如果一个客户机的事务更改了数据,其他客户机的事务是应发现这些更改还是应与其隔...
    99+
    2023-06-01
  • mysql隔离级别详解及示例
    目录mysql的4种隔离级别创建数据表:设置隔离级别只是单纯知道事物的隔离级别,但是从未操作过 今日操作一次。 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作