mysql RR、RC隔离级别实现原理

事务隔离级别实现过程

快照读(select语句)

  1. 获取事务自己版本号,即事务 ID
  2. 获取 Read View 
  3. 查询得到数据,然后 Read View 中事务版本号进行比较。
  4. 如果不符合 Read View 可见性规则(看最新数据还是副本里的数据), 即就需要 Undo log 中历史快照;
  5. 最后返回符合规则数据。

当前读(insert、update、delete,select for update、share mode)

RR原理

  • 快照读

MVCC:第一次快照读时生成 ReadView,事务提交时销毁。

  • 当前读

LBCC 使用了当前元素的临键锁(左开右闭) + 相邻间隙锁,直到事务结束才释放。

RR如何解决不可重复读?

LBCC保证并发事务的安全,一次只能一个事务去操作。

RR如何解决脏读?

LBCC保证并发事务的安全,并且规定了一次事务提交完之后另外一个事务才可以操作。

RR为什么没有办法保证幻读?

ReadView无法保证并发事务下读到数据的一致性,有可能多了也有可能少了。

LBCC的锁机制可以保证并发事务下写写的数据准确,即保证数据修改的安全性。

RC原理

  • 快照读

MVCC,每次快照读时都生成 ReadView,读完就销毁

  • 当前读

LBCC:记录锁(RC 不支持 Gap Lock),直到事务结束才释放,记录锁只锁单条记录

RC如何解决脏读?

LBCC保证并发事务的安全,并且规定了一次事务提交完之后另外一个事务才可以操作。

RC为什么不能解决不可重复读?

每次快照读都会生成一个ReadView,导致并发事务下每个事务都能读到不同的数据,有可能修改前的数据也有可能修改之后的数据。

RC为什么不能解决幻读?

每次快照读都会生成一个ReadView,导致并发事务下每个事务都能读到不同的数据,有可能读到多的数据,又可能读到少的数据。

如何选RR或者RC?

       保证并发场景下,使用RC高过RR,RC的锁的粒度是只有一行,RR是多行的锁。

       保证数据场景下,优先RR级别,RC无法保证update情况下可读的一致性,对于大批量的update同步操作可能会引发乱序的问题。

MVCC

采用乐观锁实现,它通过对不同事务生成不同的快照版本,通过UNDO版本链进行管理并且在MVCC里面,规定了高版本能够看到低版本的事务变更,低版本看不到高版本的事务变更,从而实现了不同事务之间的数据隔离。只要存在多个事务下写写场景下必阻塞,提高读的并发度。

LBCC

间隙锁

间隙锁是一种加在两个索引之间的锁,或者加在第一个索引之前,或最后一个索引之后的间隙。它锁住的是一个区间,而不仅仅是这个区间中的每一条数据。只存在于RR隔离级别下,它锁住的是间隙内的数据。加完锁之后,间隙中无法插入其他记录,并且锁的是记录间隙,而非sql语句。间隙锁之间都不存在冲突关系。

记录锁

记录锁存在于包括主键索引在内的唯一索引中,锁定单条索引记录。没有,则隐式创建索引来实施记录锁。

临键锁

记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁。符合左开右闭原则。临键锁阻止特定条件的新记录的插入,因为插入时要获取插入意向锁,与已持有的临键锁冲突。

插入意向锁

是插入一行记录操作之前设置的一种间隙锁,这个锁释放了一种插入方式的信号。 它解决的问题:多个事务,在同一个索引,同一个范围区间插入记录时,如果插入的位置不冲突,不会阻塞彼此。

自增锁

是一种特殊的表级别锁。它是专门针对 AUTO_INCREMENT 类型的列,对于这种列,如果表中新增数据时就会去持有自增锁。简言之,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行, 是连续的主键值。

共享锁(共享锁和排它锁是互斥)

读锁,并发事务读取数据,禁止任何事务执行写操作,直到共享锁释放为止。

排他锁(共享锁和排它锁是互斥)

写锁,给事务加上排它锁,该事务可以执行任意读写操作,其他事务无法获取该排它锁,也不能加其他类型的锁。(select ... for update)

意向锁

当前事务申请锁资源的时候,mysql会决定使用表的意向锁。这样,并发事务申请锁资源的时候,可以判断是否已经上了锁(意向排他锁或者意向共享锁)。

   意向共享锁:并发事务发生读取数据计划时,设置意向共享锁,希望其他事务不要加排他锁。

   意向排它锁:并发事务发生写数据计划时,设置意向排他锁,希望其他事务不要加排他锁和共享锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/677044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F1 - 标准外设库_规范

STM32F10x_StdPeriph_Lib_V3.6.0 1> 头文件包含关系2> .c文件内部结构3> 宏定义位置4> 位掩码bit mask5> .c文件中定义私有变量6> 枚举类型定义 1> 头文件包含关系 1个头文件stm32f10x.h 就把整个MCU以及标准外设库,就管理了; 2>…

101. 对称二叉树 - 力扣(LeetCode)

题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 题目示例 输入:root [1,2,2,3,4,4,3] 输出:true 解题思路 首先想清楚,判断对称二叉树要比较的是哪两个节点,要比较的可不是左右节点! 对于…

高级数据结构与算法 | 布谷鸟过滤器(Cuckoo Filter):原理、实现、LSM Tree 优化

文章目录 Cuckoo Filter基本介绍布隆过滤器局限变体 布谷鸟哈希布谷鸟过滤器 实现数据结构优化项Victim Cache备用位置计算半排序桶 插入查找删除 应用场景:LSM 优化 Cuckoo Filter 基本介绍 如果对布隆过滤器不太了解,可以看看往期博客:海量…

C++ 动态规划 数位统计DP 计数问题

给定两个整数 a 和 b ,求 a 和 b 之间的所有数字中 0∼9 的出现次数。 例如,a1024,b1032 ,则 a 和 b 之间共有 9 个数如下: 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出现 10 次,1 出现 10…

在ComfyUI上安装动画生成插件Stable Video Diffusion

上一章节我们介绍了Stable video diffusion的安装及初步使用,我们发现SVD的运行需要较大的显存,但是如果将SVD作为插件安装在ComfyUI上面,发现ComfyUI可以很好的管理显存,同时配合ComfyUI的动画制功能,可以让应用更加丰…

政安晨:示例演绎TensorFlow的官方指南(三){快速使用数据可视化工具TensorBoard}

这篇文章里咱们演绎TensorFLow的数据可视化工具:TensorBoard。 在机器学习中,要改进模型的某些参数,您通常需要对其进行衡量。TensorBoard 是用于提供机器学习工作流期间所需测量和呈现的工具。它使您能够跟踪实验指标(例如损失和…

高防服务器出租的优势及特点

高防服务器出租是指租用具备高防御能力的服务器,用于应对网络攻击、保护网站和数据安全。那么为什么会选择高防服务器出租,小编为您整理发布高防服务器出租的优势及特点。 高防服务器通常具备以下特点: 1. 高性能硬件配置:高防服务…

【八大排序】归并排序 | 计数排序 + 图文详解!!

📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构冒险记 ✅C语言进阶之路 🌅 有航道的人,再渺小也不会迷途。 文章目录 一、归并排序1.1 基本思想 动图演示2.2 递归版本代码实现 算法步骤2.3 非递归版本代…

Linux apmd命令教程:管理和监控电源管理功能(附案例详解和注意事项)

Linux apmd命令介绍 apmd 是 Advanced Power Management BIOS daemon 的缩写,它是一个用于管理和监控电源管理功能的守护进程。apmd 负责 BIOS 进阶电源管理 (APM) 相关的记录,警告与管理工作。 Linux apmd命令适用的Linux版本 apmd 命令在大多数 Lin…

containerd中文翻译系列(二十)快照器

快照器管理容器文件系统的快照。 可通过运行 ctr plugins ls 或 nerdctl info 查看可用的快照器。 核心快照器插件 通用: overlayfs(默认): OverlayFS. 该驱动程序类似于 Docker/Moby 的 "overlay2 "存储驱动程序&a…

机器学习:回归决策树(Python)

一、平方误差的计算 square_error_utils.py import numpy as npclass SquareErrorUtils:"""平方误差最小化准则,选择其中最优的一个作为切分点对特征属性进行分箱处理"""staticmethoddef _set_sample_weight(sample_weight, n_samp…

Blender教程(基础)--试图的显示模式-22

一、透视模式(AltZ) 透视模式下可以实现选中透视的物体信息 发现选中了透视区的所有顶点 二、试图着色模式-显示网格边框 三、试图着色模式-显示实体 三、试图着色模式-材质预览 四、试图着色模式-显示渲染预览

深入解析MySQL 8:事务数据字典的变革

随着数据库技术的不断发展和完善,元数据的管理成为了一个日益重要的议题。在MySQL 8中,一项引人注目的新特性是引入了事务数据字典(Transaction Data Dictionary,简称TDD),它改变了元数据的管理方式&#x…

医学图像隐私保护

随着数字医疗技术的快速发展,医学图像例如X光片、CT扫描、MRI及超声波扫描已成为现代医疗診断和治療的基石。然而,同时这些包含敏感个人信息的图像也面临着隐私和安全方面的挑战。随着数据泄露事件的增多,医学图像隐私保护变得尤为重要。 从…

Ps:直接从图层生成文件(图像资源)

通过Ps菜单:文件/导出/将图层导出到文件 Layers to Files命令,我们可以快速地将当前文档中的每个图层导出为同一类型、相同大小和选项的独立文件。 Photoshop 还提供了一个功能,可以基于文档中的图层或图层组的名称,自动生成指定大…

CleanMyMacX4.14.6如何清理mac垃圾内存

一直以来,苹果电脑的运行流畅度都很好,但是垃圾内存多了磁盘空间慢慢变少,还是会造成卡顿的。这篇文章就告诉大家电脑如何清理垃圾内存,电脑如何清理磁盘空间。 一、电脑如何清理垃圾内存 垃圾内存指的是各种缓存文件和系统垃圾…

Java图形化界面编程——事件处理 笔记

2.6 事件处理 前面介绍了如何放置各种组件,从而得到了丰富多彩的图形界面,但这些界面还不能响应用户的任何操作。比如单击前面所有窗口右上角的“X”按钮,但窗口依然不会关闭。因为在 AWT 编程中 ,所有用户的操作,都必…

多个总体均值的比较(多元方差分析)

多元方差分析是什么 多元方差分析是一种统计方法,用于比较两个或更多组的均值在一个或多个自变量上的差异是否具有统计学意义。它可以同时考虑多个自变量对因变量的影响,以及自变量之间的交互作用。它是广义线性模型的拓展,适用于因变量为连…

JMeter使用教程

作为一名开发工程师,当我们接到需求的时候,一般就是分析需要,确定思路,编码,自测,然后就可以让测试人员去测试了。在自测这一步,作为开发人员,很多时候就是测一下业务流程是否正确&a…

Python 小白的 Leetcode Daily Challenge 刷题计划 - 20240209(除夕)

368. Largest Divisible Subset 难度:Medium 动态规划 方案还原 Yesterdays Daily Challenge can be reduced to the problem of shortest path in an unweighted graph while todays daily challenge can be reduced to the problem of longest path in an unwe…