返回顶部
首页 > 资讯 > 数据库 >详解MySQL 数据库隔离级别与MVCC
  • 801
分享到

详解MySQL 数据库隔离级别与MVCC

MySQL隔离级别MySQLMVCC 2022-05-15 07:05:45 801人浏览 安东尼
摘要

Mysql是我们日常生产与学习中最常接触到的数据库之一,今天讲一讲在mysql(或者说其他类似的数据库)中存在的隔离级别以及用来提高效率的多版本并发控制(mvcC)。 一、隔离级别 首先我们需要提到一个概念:事务。

Mysql是我们日常生产与学习中最常接触到的数据库之一,今天讲一讲在mysql(或者说其他类似的数据库)中存在的隔离级别以及用来提高效率的多版本并发控制(mvcC)。

一、隔离级别

首先我们需要提到一个概念:事务。什么是事务?事务就是完成一个基础操作的一系列操作语句的一个集合。例如我要将200元从账户A转移到账户B,那么我可能会进行一下的操作:
a.验证账户A中的余额是否大于200元。
b.将账户A中的余额减200元。
c.将账户B中的余额加200元。
我们就将上面的abc三个操作成为一个事务。
这时,我们会注意到我们所说的一个事务有可能是由多条语句组合而成的,而事务又存在原子性,即事务的执行过程中是不能被打断的,这就带来一个问题,如果在这三步执行过程中有另外的语句插入进来执行,是否会对结果产生影响,因为此时破坏了事务的原子性。而这种插入的情况在并发的环境下是十分常见的。因此,我们(或者说是数据库引擎)就需要在一个事务的执行过程中对它进行“保护”,即保证外界的其他事务的语句不能随意的插进正在执行的事务语句之中,来保证事务的正常执行。这时候我们很容易的会想到“加”这个方法。这其实是一种很笼统的说法,因为加锁虽然能够保证事务的正常执行,但是却会带来较大的额外开销,因此合适的时候选择合适的加锁方式对查找效率的影响就非常大。而“锁”得严不严,就区分除了集中不同的隔离级别。

READ UNCOMMITED(读未提交)

这种隔离界别下,读取数据的时候不受任何影响。即你甚至可以读取一个正在被其他事务修改的数据,想读就读,想改就改。这当然开销很小,但是会带来许多的问题,比如“脏读”。即读取到了正在修改但是却还没有提交的数据,这就会造成数据读取的错误。从性能上来说,READ UNCOMMITED不会比其他级别好太多,但是却带来了非常多的麻烦的问题,因此在实际中很少使用这个个立即被。

READ COMMITED(提交读/不可重复读)

这个级别在READ UNCOMMITED的基础上添加了一些规定,是一些数据库的默认隔离级别。它与READ UNCOMMITED的区别在于,它规定读取的时候读到的数据只能是提交后的数据。举个例子,数据a在上一次提交之后的值是1,这时候有一个线程进来对a进行修改,将a修改为2,但是此时并未提交事务(COMMIT),在这种情况下,READ UNCOMMITED级别下读取到的a的值就是当前的2,但是READ COMMITED级别下读取到的还是上一次提交之后的值,即a为1,必须到修改线程将a的值变为2这个事务提交之后读取到的a的值才是2。这个级别所带来的问题就是不可重复读。即上一个时间读取到的a的值是1,但是随着修改线程对事务的提交,a的值变为了2,这时候读到的值就是2了,即执行两次相同的读取操作得到的值却不一样。
不可重复读同脏读的区别在于,脏读是一个事务读取了另一未完成的事务执行过程中的数据,而不可重复读是一个事务执行过程中,另一事务提交并修改了当前事务正在读取的数据。

REPEATED READ(可重复读)

REPEATED READ在READ COMMITED的基础上又添加了一些约束性的规则,它也是Mysql数据库的默认隔离级别。简单来说就是在一个事务的执行期间禁止其他事务对相应的数据进行修改,这就彻底使得一个事务的执行过程中所查询到的数据一定是一致的,即解决了脏读和不可重复读的问题,但是却带来了新的问题,即“幻读”。
“幻读”指的是在一个事务执行过程中虽然禁止了对相应数据的修改,但是其他的事务依然可以插入数据,这时候第一个事务就会发现会“莫名其妙”多出来一些数据,像是出现了幻觉似的。幻读和不可重复读都是读取了另一条已经提交的事务(这点同脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。

SERIALIZABLE (可串行化)

这是最严格的一个隔离级别。它通过强制事务串行执行,避免了幻读的问题。但是这种隔离级别的开销极大,一般也不常使用。

各种隔离级别与可能的问题关系如下:

隔离级别 脏读 不可重复读 幻读 加锁
READ UNCOMMITED YES YES YES NO
READ COMMITED NO YES YES NO
REPEATED READ NO NO YES NO
SERIALIZABLE NO NO NO YES

二、MVCC

试想一下,如果每次SQL操作为了保证数据的一致性与准确性,都需要加一个行级锁的话,非常可靠,但是带来的系统开销与查找效率的下降也是非常明显的,因此MVCC就是为了解决这种矛盾而产生的。
首先MVCC会在表中的每一行记录后面保存两个隐藏的列,一个保存行的创建时间,一个保存行的过期(删除)时间。这个时间值并不是真的时间,而是一个系统版本号。事务开始的时刻的系统版本号作为事务的版本号,用来和查询到的每行记录的版本号进行比较。

  • INSERT:为新插入的每一行保存当前的系统版本号作为行版本号。
  • DELETE:为删除的每一行保存当前的系统版本号最为行删除版本号。
  • UPDATE:更新其实应该理解为插入一条新的数据,并删除原来数据的过程,即为新插入的数据保存当前的系统版本号作为行版本号,并为删除的数据保存当前的系统版本号作为删除版本号。
  • SELECT:只查询满足下列条件的行:

a.行版本号小于等于事务版本号
b.删除版本号未定义或者大于事务版本号

保存了这两个版本号之后绝大多数的操作都可以在不加锁的情况下进行正确的操作,保证了性能和效率。
值得注意的是MVCC只在READ COMMITED和REPEATABLE READ两个隔离级别下工作。

以上就是详解MySQL 数据库隔离级别与MVCC的详细内容,更多关于MySQL 数据库隔离级别与MVCC的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 详解MySQL 数据库隔离级别与MVCC

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

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

猜你喜欢
  • 详解MySQL 数据库隔离级别与MVCC
    Mysql是我们日常生产与学习中最常接触到的数据库之一,今天讲一讲在Mysql(或者说其他类似的数据库)中存在的隔离级别以及用来提高效率的多版本并发控制(MVCC)。 一、隔离级别 首先我们需要提到一个概念:事务。...
    99+
    2022-05-15
    MySQL 隔离级别 MySQL MVCC
  • 详解MySQL事务的隔离级别与MVCC
    事务隔离级别 事务并发执行遇到的问题 脏写 如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写 脏读 ...
    99+
    2022-05-16
    MySQL事务的隔离级别 MySQL MVCC
  • mysql数据库隔离级别详解
    目录隔离级别一、mysql有四个事务隔离级别二、为什么默认RR隔离级别?三、RR隔离级别下手动加锁解决幻读理论基础脏读、不可重复读、幻读 及其解决方法事务隔离级别命令行操作操作验证一、实现脏读二、操作验证--实现不可重复...
    99+
    2022-06-16
    mysql隔离级别是什么 数据库事务的四种隔离级别 mysql隔离级别设置
  • MYSQL事务的隔离级别与MVCC
    目录前言1. 事务(transaction)的起源1.1. 事务的定义1.2. 哪些存储引擎支持事务2. MySQL的事务语法2.1. 自动提交2.2. 手动操作事务2.2.1. 开...
    99+
    2024-04-02
  • Mysql隔离级别、锁与MVCC有什么用
    这篇文章主要介绍了Mysql隔离级别、锁与MVCC有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们经常所高并发,高可用。就是从质和...
    99+
    2024-04-02
  • 数据库隔离级别
    数据库隔离级别 如果没有隔离级别会出现的问题 脏读 意思是读取到了事务正在修改的数据,如果事务回滚,那么拿到的数据就是错误的 时间 事务A 事务B 1 开始事务 2 读取quantity为5 3 修改qu...
    99+
    2019-12-06
    数据库隔离级别
  • MySQL事务与MVCC怎么实现隔离级别
    这篇文章给大家介绍MySQL事务与MVCC怎么实现隔离级别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。数据库事务介绍事务的四大特性(ACID)原子性(atomicity): 事务的最...
    99+
    2024-04-02
  • mysql数据库事务及隔离级别
    事务的四大特性: 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; 隔离性: 并发访问数据库时,一个用户的事务...
    99+
    2021-09-18
    mysql数据库事务及隔离级别
  • MySQL事务、隔离级别及MVCC是什么
    这篇文章主要介绍了MySQL事务、隔离级别及MVCC是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。mysql教程栏目介绍MySQL相关的事...
    99+
    2022-11-30
    mysql vcc
  • MySQL事务隔离级别详解
    一、什么是事务? 事务是逻辑上的一组操作,要么全执行,要么全不执行。 事务最经典栗子也经常被拿出来的栗子就是银行转账了。比如小明要给小红转账1000元,这个转账会涉及到两个关键操作:将小明的余额减1000元,将小红的余额减1000元。万一这...
    99+
    2023-08-30
    mysql
  • mysql如何查看数据库隔离级别
    要查看MySQL数据库的隔离级别可以使用以下步骤: 1、打开 MySQL 命令行客户端或者数据库管理工具,连接到目标数据库。 2、执...
    99+
    2024-04-17
    mysql
  • MySQL事务和MVCC怎么实现隔离级别
    这篇文章主要讲解了“MySQL事务和MVCC怎么实现隔离级别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL事务和MVCC怎么实现隔离级别”吧!数据...
    99+
    2024-04-02
  • 数据库事务隔离级别:为你的数据库选择合适的隔离级别
    什么是数据库事务隔离级别 数据库事务隔离级别是指,在数据库系统中,当多个事务同时访问和修改数据时,为了保证数据的一致性和完整性,而采取的隔离机制。事务隔离级别决定了一个事务在什么情况下可以看到其他并发事务对数据库的修改。 事务隔离级别的类...
    99+
    2024-02-10
    数据库 事务 隔离级别 并发访问 数据完整性 一致性
  • 数据库事务的隔离级别
    数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。下面通过事...
    99+
    2014-06-29
    数据库事务的隔离级别 数据库入门 数据库基础教程 数据库 mysql
  • 数据库隔离级别有哪些
    小编给大家分享一下数据库隔离级别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!数据库隔离级别包括:1、读未提交;2、读已提...
    99+
    2024-04-02
  • 数据库事务隔离的级别
    本篇内容介绍了“数据库事务隔离的级别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 概述与背景这是数据库...
    99+
    2024-04-02
  • 【数据库的四种隔离级别】
    在关系型数据库中,隔离级别是指多个事务并发执行时,彼此之间的隔离程度。数据库的四种隔离级别如下: 1.读未提交(Read Uncommitted): 最低级别的隔离级别,一个事务可以读取到另一个事务未提交的数据,可能会出现脏读、不可重复读和...
    99+
    2023-08-19
    数据库 java 开发语言
  • mysql隔离级别详解及示例
    目录mysql的4种隔离级别创建数据表:设置隔离级别只是单纯知道事物的隔离级别,但是从未操作过 今日操作一次。 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时...
    99+
    2024-04-02
  • 一文带你了解MySQL之事务隔离级别和MVCC
    目录 一、数据准备二、事务隔离级别2.1 事务并发执行遇到的问题2.2 SQL标准中的四种隔离级别2.3 MySQL中支持的四种隔离级别 三、MVCC3.1 版本链3.2 ReadView3.2.1 READ COMMITTED...
    99+
    2023-08-16
    mysql 数据库 数据库开发 大数据 数据库架构
  • 数据库事务:ACID 和隔离级别
    一、什么是事务 事务是将多条 SQL 作为一个整体进行数据操作。这样能确保全部执行成功或全部执行失败,不改变任何数据。根据业务需求选择不同的存储引擎。对于那些不需要事务的查询类应用,选择非事务型的存储引擎能得到更高的性能,LOCK TABL...
    99+
    2016-06-16
    数据库事务:ACID 和隔离级别
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作