MySQL-无锁读

news2025/7/4 17:25:12

快照

快照是一个指定时间点的数据表示,也就是,在指定时间点的数据版本,即使其他事务对源数据版本做出修改,快照对应的数据版本也不会发生变化,主要是用于事务隔离级别中提供一致性读。

一致性读

一致性读是指一个读操作使用快照信息呈现基于时间点的查询结果,即使在查询的过程中同时存在其他事务对相同的数据记录执行更新的操作。如果已查询的数据记录已被其他事务修改,InnoDB依然可以从重做日志(undo log)中重新构建出原始的数据记录。该技术可以避免一些锁带来的问题,例如,强迫一个事务等待其他事务执行完成,从而降低并发性。

使用可重复读的事务隔离级别,快照是基于第一次读操作(时间点)而获取到的数据版本。使用读提交的事务隔离级别,快照是基于每次读操作(不断变化的时间点,时间点取决于其他事务提交的数据版本的时间点)而获取到的数据版本。

一致性读是InnoDB处理SELECT语句的默认模式,其使用读提交或者可重复读的事务隔离级别。一致性读没有对访问的数据表设置任何锁,一个会话在执行一致性读期间,其他会话可以自由地修改这些数据表。

一致性无锁读

如前面所述,一致性读是指InnoDB使用多数据版本的控制技术呈现一个基于时间点的数据库查询结果,该查询能看到发生在对应时间点之前的由事务提交的数据变化,该查询不能看到发生在对应时间点之后的由事务提交或者事务回滚的数据变化。例外的情况是,查询能看到同一个事务内更早的语句更新的变化,也就是,如果用户A的会话更新一个数据表中的一些行记录,一个SELECT查询语句能看到这些行记录的最新版本,也可能看到这些行记录的更早版本,如果同时其他用户的会话更新相同数据表的相同行记录,则例外的情况是,用户A的会话可能看到的是一个永远不在数据库中存在的数据表的状态(由于并发性,数据可能已经被覆盖了)。

如果一个事务的隔离级别是可重复读(默认级别),在同一个事务中的一致性读是读取由第一次读确立的快照,如果想读到更新的快照,可以先提交当前的事务,再发起新的查询操作。

如果一个事务的隔离级别是读提交,在同一个事务中的一致性读是每次读取由该次读确定立的快照(在并发中,如果存在其他事务提交新的数据版本,则每次读到数据版本不相同)。

假设,当前数据库使用可重复读的事务隔离级别,会话A执行SELECT语句查询的时候,数据库返回一个时间点A的快照,随后,其他事务B删除会话A中查询对应的记录并提交事务,则会话A不能看到已经被删除的记录,插入或者更新操作的处理方式与查询的处理方式相同。

快照技术是应用于数据库的查询操作,而不同事务之间对相同的行记录的更新、删除、增加操作会相互影响,如果事务A增加或者修改一些行记录并提交事务,而其他事务B的删除或者更新语句会影响之前事务A的提交(事务隔离级别是可重复读),即使事务B的会话查询不到事务A的会话中的提交。如果事务A更新或者删除其他事务B的提交,则事务A的会话能看到自身的提交,举例如下所示:

先提交会话中的事务,再执行查询,可以使用语句SELECT或者语句START TRANSACTION WITH CONSISTENT SNAPSHOT获取到更新之后的快照,这种机制是多版本并发控制(MVCC)。

假设,存在会话A与会话B,只有在会话A与会话B的事务都已经提交,然后,会话A再执行查询才能获取到新版本的快照,举例如下所示:

如果会话中需要时刻看到最新的快照,则使用读提交的事务隔离级别或者使用有锁读(后续章节中详细描述),举例如下所示:

使用读提交的事务隔离级别,每个事务读取自身获取到最新的快照,而使用FOR SHARE语句,则使用有锁读,SELECT语句阻塞直到包括最新快照的事务结束,再获取最新的快照。

一致性读并不是在全部的数据定义语言中使用,如下所示:

  • 一致性读不能用在DROP TABLE语句中,因为MySQL不可能使用一个已经被删除的数据表

  • 一致性读不能用在ALTER TABLE语句中,该操作是先建立来自源数据表的临时数据表,待数据复制到临时表完成,则删除源数据表,对新数据表执行一致性读则发生错误

语句INSERT INTO ... SELECT或者语句UPDATE ... (SELECT)或者语句CREATE TABLE ... SELECT执行读值时的处理如下所示:

  • 默认地,InnoDB使用更加强的锁处理这些语句,SELECT语句部分使用读提交的事务隔离级别执行一致性读

  • 设置读未提交的事务隔离级别执行无锁读

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

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

相关文章

Chrome调试工具和Emmet语法

调试工具的使用: 打开页面,鼠标"右击"检查: Ctrl滚轮可以放大开发工具代码的大小: 右边CSS样式可以改变数值(左右箭头或者直接输入)和查看颜色,以此来即时改变网页的元素设置 Ctr…

【C】语言文件操作(二)

🙈个人主页: 阿伟t 👉系列专栏:【C语言–大佬之路】 🎈今日心语:越忙,越要沉住气! 继【C】语言文件操作(一)中我们详细地介绍了文件的顺序读写等一系列函数&…

【数据结构与算法】ArrayList与顺序表

✨个人主页:bit me ✨当前专栏:数据结构 ✨每日一语:上海就是商海,北京就是背景,誓言就是失言,彩礼就是财力,理想就是离乡,而平民就要拼命 ArrayList与顺序表💦一.线性表…

刷题笔记之十 (小易的升级之路+找出字符串中第一个只出现一次的字符+洗牌+MP3光标位置)

目录 1.存取任意指定序号的元素和在最后进行插入和删除运算,利用顺序表存储最节省时间 2. 数据结构中具有记忆功能的是栈 3. 递归程序的优化一般为 尾递归优化 4.二叉树遍历,前中后序遍历用到的是栈,而层序遍历用到的队列 5. 将两个各有n个元素的有序表归并成一个有序表,最…

Mybatis的增删改查操作

增删改查操作对于我们程序员来说是最基本也是最重要的操作.那么在Mybatis框架下如何对jdbc中的数据进行增删改查操作? 首先,在介绍之前,我们先来了解一下我们在进行增删改查操作过程中会遇到的各种属性和重要方法: 属性 1.namespace: 称为命名空间,用来将dao与Mapper进行绑…

[Python教程]三位数倒序

前言 最近博主也是没有什么时间来写文章,估计已经快两个月没写新文章了吧,这不,今天有空,所以想着写一篇文章。 今天的文章主要是面对Python刚刚入门的读者写的 涉及知识点 数据的基本运算字符串与数字的拼接输入与打印 相信…

Python正则表达式(持续更新,各种字符串筛选,总有一款适合您当前的功能)

前言 整个文章都是以精华部分为主,主要分文2个部分: 1、python的【re】正则表达式使用方法。 2、【re】正则表达式以及对应的demo。 第一部分让你知道【re】的几个函数的区别,更好的匹配项目中的需求。 第二部分让你快速的匹配具体需要的正则…

学习笔记-java代码审计-表达式注入

java代码审计-表达式注入 0x01漏洞挖掘 spel spel表达式有三种用法&#xff1a; 注解 value("#{表达式}") public String arg; 这种一般是写死在代码中的&#xff0c;不是关注的重点。 xml <bean id"Bean1" class"com.test.xxx"><prop…

Jquery

目录 一、基本介绍 二、下载地址 三、基本使用 四、jQuery对象和dom对象 五、jQuery选择器 六、jQuery的DOM操作 七、总结 相关文章 JSP的使用JSP的使用 JSON&AjaxJSON&Ajax一、基本介绍jQuery 是一个快速的&#xff0c;简洁的 javaScript 库&#xff0c;使用户能更方便…

DINO学习笔记

DINO学习笔记 DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection Abstract 我们提出了DINO(DETR with Improved deNoising anchOr boxes)&#xff0c;一种先进的端到端对象检测器。DINO采用对比的去噪训练方法、混合查询选择方法进行锚点初…

【蓝桥杯专项】动态规划_背包问题合集(Java)

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【蓝桥杯专项】 ✈️✈️本篇内容:动态规划_背包问题合集&#xff01; &#x1f680;&#x1f680;码云仓库gitee&#xff1a;Java数据结构代码存放! ⛵⛵作者简介…

【C++笔试强训】第二十二天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6;&a…

动态内存管理

目录 内存中的栈区和堆区 malloc free calloc realloc 内存中的栈区和堆区 我们知道php的底层是C (任何语言其实都可以分为大同小异的几块) 而C语言的内存模型分为5个区&#xff1a;栈区、堆区、静态区、常量区、代码区。每个区存储的内容如下&#xff1a; 1、栈区&…

网络:IP与MAC

如果我们要跟对方通信&#xff0c;我们需要知道对方的IP地址与MAC地址。 一、IP IP地址&#xff0c;32位&#xff0c;工作在网络层&#xff0c;属IP协议族。在互联网中逻辑的代表某一台设备&#xff0c;但是在不同的时间&#xff0c;与我合作的主机非常多。某一个设备使用完我…

2022/11/12 json格式转换对象 动态sql

PostMapping public Integer save(RequestBody User user){return userMapper.insert(user); }选择json格式。以为本人忘记选了415错误&#xff0c;media错误 mybatisx插件 sprinboot yml文件导入xml mybatis: mapper-locations: classpath:mapper/*.xml 一直报错 发现重复了…

【华为ICT大赛】华为云激活设备的方法以及数据上下行

先展示一下没有激活的时候在线调试的状态 然后下面我将激活他&#xff0c;让他变为下面这个样子 官方教程 这里我从0演示一个产品的创建到MQTT.fx连接到云平台并且接收数据。 进入华为云平台控制台 然后开始创建一个产品 创建完毕产品之后就可以开始创建服务了&#xff0c;一…

提高工作效率的 keychron 键盘,你还没有入手吗?

前言 大家好&#xff0c;今天给大家推荐一款我最近入手并且一直在使用的机械键盘 keychron K4 。我自己是一个键盘的重度使用者&#xff0c;由于工作的需求&#xff0c;对键盘有很大的依赖&#xff0c;而一款可以提高工作效率的键盘&#xff0c;往往可以让我们的工作事半功倍。…

文化馆建筑方案设计原理及方案

文化馆建筑的分类与作用 根据职能不同&#xff0c;文化馆建筑可分为文化馆、群众艺术馆和文化站等形式。 文化馆是国家设立的开展社会宣传教育、普及科学文化知识、组织辅导群众文化艺术(活动)的综合性文化事业机构和场所。 群众艺术馆是国家设立的组织指导群众文化艺术活动及…

Github工程中的Markdown语言应用

Github工程中的Markdown语言应用1. 介绍2. 工具2.1 下载链接2.2 编辑界面2.3 插件安装3. 基本操作3.1 标题编写3.2 正文编写3.3 代码块编写3.4 加粗倾斜3.5 有序列表3.6 无序列表3.7 行内代码编写4. 参考资料最早开源代码中&#xff0c;接触的最多的就是Readme文件&#xff0c;…

Altium格式PCB转换成Allegro操作指导

Altium格式PCB转换成Allegro操作指导 首先打开Altium Design的PCB文件,输出一个“PCB ASCII File(*.pcbdoc)”格式的文件。如下图 打开Allegro,选择was performance L模式,新建空白的brd。 导入Altium PCB 选择文件转换即可 转换成功 This section is describe what t…