iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql如何实现隔离级别
  • 643
分享到

mysql如何实现隔离级别

2024-04-02 19:04:59 643人浏览 安东尼
摘要

Mysql如何实现隔离级别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。隔离级别事务指定一个隔离级别,该隔离级别定义一个事务必须与由其他事

Mysql如何实现隔离级别?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

隔离级别

事务指定一个隔离级别,该隔离级别定义一个事务必须与由其他事务进行的资源或数据更改相隔离的程度。隔离级别从允许的并发副作用(例如,脏读或幻读)的角度进行描述。

控制内容:

读取数据时是否占用以及所请求的锁类型。

占用读取锁的时间。

引用其他事务修改的行的读取操作是否:

在该行上的排他锁被释放之前阻塞其他事务。

检索在启动语句或事务时存在的行的已提交版本。

读取未提交的数据修改。

隔离级别的实现:

未提交读(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如何实现隔离级别问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网数据库频道了解更多相关知识。

您可能感兴趣的文档:

--结束END--

本文标题: mysql如何实现隔离级别

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

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

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

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

下载Word文档
猜你喜欢
  • MySQL中的事务隔离级别如何实现
    小编给大家分享一下MySQL中的事务隔离级别如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说到数据库事务,大家脑子里一定...
    99+
    2024-04-02
  • innodb如何实现事务隔离级别
    这篇文章主要介绍了innodb如何实现事务隔离级别,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言之前的文章mysql锁机制详解中我们详细...
    99+
    2024-04-02
  • 如何修改mysql的隔离级别
    这篇文章给大家分享的是有关如何修改mysql的隔离级别的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 修改mysql隔离级别的方法:1、找到“skip...
    99+
    2024-04-02
  • 【MySQL】事务及其隔离性/隔离级别
    需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云-->阿里云-->华为云 show variables like 'autocommit';+---------------+-------+| Variable_name...
    99+
    2023-09-01
    mysql 数据库
  • mysql如何查看事务隔离级别
    要查看MySQL数据库的当前事务隔离级别,可以执行以下命令: SELECT @@tx_isolation; 该命令将返回当前数据库...
    99+
    2024-04-17
    mysql
  • mysql如何修改事务隔离级别
    小编给大家分享一下mysql如何修改事务隔离级别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!用户可以用SET TRANSACT...
    99+
    2024-04-02
  • mysql如何查询事务隔离级别
    这篇“mysql如何查询事务隔离级别”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysq...
    99+
    2024-04-02
  • mysql事务隔离的级别
    这篇文章主要介绍“mysql事务隔离的级别”,在日常操作中,相信很多人在mysql事务隔离的级别问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql事务隔离的级别”的疑惑...
    99+
    2024-04-02
  • MySQL事务和MVCC怎么实现隔离级别
    这篇文章主要讲解了“MySQL事务和MVCC怎么实现隔离级别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL事务和MVCC怎么实现隔离级别”吧!数据...
    99+
    2024-04-02
  • MySQL隔离级别有哪些
    这篇文章将为大家详细讲解有关MySQL隔离级别有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。业务的特性  业务是有四个特性(ACID)的,分别是原子性...
    99+
    2024-04-02
  • MySQL事务与MVCC怎么实现隔离级别
    这篇文章给大家介绍MySQL事务与MVCC怎么实现隔离级别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。数据库事务介绍事务的四大特性(ACID)原子性(atomicity): 事务的最...
    99+
    2024-04-02
  • MySQL串行化隔离级别(间隙锁实现)
    目录一、间隙锁的概念二、测试间隙锁范围加锁场景1:用不可重复的主键id测试间隙锁场景2:用可重复的age(有索引)测试间隙锁场景3:实际情况需要具体分析用的到底是行锁还是表锁三、测试...
    99+
    2024-04-02
  • Mysql有哪些隔离级别
    今天就跟大家聊聊有关Mysql有哪些隔离级别,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  什么是事务  事务是应用程序中一系列严密的操作,所有操...
    99+
    2024-04-02
  • mysql中如何修改事务隔离级别
    小编给大家分享一下mysql中如何修改事务隔离级别,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 修改方法:1、在命令窗口中执行“set session tra...
    99+
    2024-04-02
  • MySQL事务与隔离级别如何使用
    这篇文章主要介绍“MySQL事务与隔离级别如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL事务与隔离级别如何使用”文章能帮助大家解决问题。什么是事务事务就是一组操作的集合,事务将整组...
    99+
    2023-07-05
  • mysql如何查看数据库隔离级别
    要查看MySQL数据库的隔离级别可以使用以下步骤: 1、打开 MySQL 命令行客户端或者数据库管理工具,连接到目标数据库。 2、执...
    99+
    2024-04-17
    mysql
  • mysql的隔离级别有哪些
    MySQL的隔离级别有以下四个:1. 读未提交(Read Uncommitted):最低的隔离级别,允许一个事务读取另一个未提交的事...
    99+
    2023-08-19
    mysql
  • 怎么在mysql中实现事务的隔离级别
    这篇文章给大家介绍怎么在mysql中实现事务的隔离级别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。事务就是一组一起成功或一起失败的sql语句。事务还应该具备,原子性,一致性,隔离性和...
    99+
    2024-04-02
  • mysql事务隔离级别详情
    serializable 串行化(无问题) 事务必须以顺序的方式执行,前一个事务提交之前后面的事务无法进行提交,最安全,但是不能并发操作,导致效率低下. repeatab re...
    99+
    2024-04-02
  • mysql中有哪些隔离级别
    本篇文章为大家展示了mysql中有哪些隔离级别,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、read uncommitted(RU):是不允许发生脏写的不可能两个事务在没提交的情况下去更新同一行...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作