MySQL(五)一致性非锁定读与一致性锁定读

(三)MySQL InnoDB非锁定一致性读与锁定读 MySQL InnoDB非锁定一致性读与锁定读 (一)MySQL InnoDB事务模型 (二)MySQL InnoDB锁模型 (三)MySQL InnoDB非锁定一致性读与锁定读 (四)MySQL InnoDB锁类型及幻象读问题 (五)MySQL InnoDB中各类语句加锁方式 (六)事务的提交与回滚极死锁检测、处理和预防 非锁定一致性读 一致性读,意味着InnoDB使用“多本版” 阅读详情

一致性非锁定读

一致性非锁定读是什么?这里我先给出一个最最最简单的解释:一致性非锁定读就是读快照!

快照即当前行数据之前的历史版本,每行记录可能存在多个历史版本,或者说每行记录可能有不止一个快照数据,一般我们将这种技术称为 行多版本技术。而由于一个行记录可能对应着多个快照(历史版本),为此不可避免地会带来一系列的并发问题,如何解决这些并发问题,就是所谓的 多版本并发控制(MVCC)。

在不同事务隔离级别下,读取的方式不同。只有在事务隔离级别 READ COMMITTED 和 REPEATABLE READ(默认)下,InnoDB 存储引擎才会使用非锁定的一致性读。并且,即使都是使用非锁定的一致性读,它俩对于快照数据的定义也各不相同:

  • 在 READ COMMITTED 事务隔离级别下,总是读取行的最新版本;如果行被锁定了,非一致性读不会因此去等待行上锁的释放,而是去读取该行版本的最新一个快照
  • 在 REPEATABLE READ 事务隔离级别下,对于快照数据,非一致性读总是读取事务开始时的行数据版本

这么说可能还不是很好理解,举个例子,这个时候又得掏出我们经典的 user 表了(滑稽),表中包含三个字段 id、username、age,已存在一行记录:

id = 1, username = 'Jack', age = 20;

第一步,我们开启一个事务,执行如下语句:

事务 1:
	begin;
	select * from user where id = 1;

可以看到,第一个事务并没有提交,这时,我们开启第二个事务模拟并发,执行如下语句:

事务 2:
	begin;
	update user set id = 100 where id = 1;

在第二个事务中,将表中 id 为 1 的记录修改为了 id=100,但是事务同样没有提交(即此时 id = 1 的行记录被事务 2 加上了行锁)。这时如果在第一个事务中再次读取 id 为 1 的记录,那显然还是 1 对吧:

事务 1:
	select * from user where id = 1;

在这里插入图片描述

接着,我们再来提交下第 2 个事务中所作的修改:

事务 2:
	commit;

由于当前 id = 1 的数据被修改成了 100,也就是说,当前id = 100 的行记录拥有了一个 id = 1 的历史版本。

在这里插入图片描述
这个时候,再去事务 1 中读取 id 为 1 的记录,在 READ COMMITTED 和 REPEATABLE 事务隔离级别下得到结果就不一样了:

  • 对于 READ COMMITTED 的事务隔离级别,由于事务 2 已经提交了,也就是说 id = 1 的行记录没有被事务 2 锁定,所以就会去读取该行的最新版本,即 id = 100,So, 在 READ COMMITTED 的事务隔离级别下,此时查询 id = 1 的结果是 Empty Set;

  • 而在 REPEATABLE READ 事务隔离级别下,非一致性读总是读取事务开始时的行数据版本。也就是说,在事务 1 刚开始的时候,id = 1 的数据行是什么样,现在读到的就是什么样的:

在这里插入图片描述
可以结合下面这张图来回顾下上述的过程:
在这里插入图片描述

一致性锁定读

其实从名字上也能看出来,非一致性锁定读适用于对数据一致性要求不是很高的情况,比如在 READ COMMITTED 隔离级别下,即使行被锁定了,非一致性读也可以读到该行版本的最新一个快照。也即,非锁定读机制极大地提高了数据库的并发性。

而一致性锁定读适用于对数据一致性要求比较高的情况 ,这个时候我们需要对读操作进行加锁以保证数据逻辑的一致性。

InnoDB 存储引擎对读操作支持两种一致性锁定读方式,或者说对读操作支持两种加锁方式:

  • SELECT ... FOR UPDATE,对于读取的行记录加一个 X 排它锁,其他事务不能对锁定的行加任何锁
  • SELECT ... LOCK IN SHARE MODE,对于读取的行记录添加一个 S 共享锁。其它事务可以向被锁定的行加 S 锁,但是不允许添加 X 锁,否则会被阻塞住

So,如何用大白话解释一致性锁定读?上面这两条特殊的 select 语句就是一致性锁定读!一致性锁定读就是给行记录加 X 锁或 S 锁!

mysql 中锁的一致性非锁定读 和 一致性锁定读 1.什么是锁 锁是数据库系统区别于文件系统的一个关键特性,锁机制用于管理对共享资源的并发访问。InnoDB存储引擎会在行级别上对表数据上锁,这固然不错,不过 InnoDB存储引擎也会在数据库内部其他多个地方使用锁,从而允许对多种不同的资源提供并发访问。例如 操作缓冲池中的LRU列表。删除、添加、移动LRU列表中的元素,为了保证一致性,必须有锁的介入,数据库系统使用锁是为了支持对共享资源进行并发访问,提供一致性。 对于MyISAM引擎,其锁死表锁设计,并发情况下读是没问题的,但是并发插入性能就要差一 阅读详情

相关推荐

MySQL的一致性非锁定读和锁定读

一致性非锁定读和锁定读是MySQL中常用的读取数据的方式。请注意,在实际应用中,还需要考虑事务的隔离级别和并发控制机制,以确保数据的一致性和并发性能的平衡。在MySQL中,存在两种常见的读取数据的方式,即一致性非锁定读和锁定读。一致性非锁定读是指在读取数据时,不会对数据进行锁定,从而允许其他并发事务对数据进行修改。一致性非锁定读提供了较高的并发性能,但可能会读取到未提交的数据或者被其他事务修改的数据。由于一致性非锁定读不会对数据进行锁定,事务1读取到的数据可能是未提交的数据或者已被事务2修改的数据。

SrySmalltalk的博客 207

Mysql之一致性非锁定读与一致性锁定读

Mysql之一致性非锁定读与一致性锁定读

weixin_42189550的博客 809

(十三)深入理解 一致性锁定读 与 一致性非锁定读

一致性锁定读 与 一致性非锁定读 产生的原因 在mysql数据库中,有一个行锁的概念。行锁有两种类型:共享锁(s),排它锁(x);x锁和s锁是不能互相兼容的,而s锁与s锁是可以互相兼容的;在mysql的设计中,在写操作的时候会自动给选定行加上x锁,也就是所谓独占锁,即在没有释放x锁之前,任何会话都不能访问锁定行,我相信这个是没有问题的;但是这样会有问题,别的会话去读加了x锁的行时在正常逻辑下,...

weixin_38312719的博客 2263

MySQL锁(1) 一致性非锁定读和一致性锁定读

一致性非锁定读(consistent nonlocking read)         一致性非锁定读是值InnoDB存储引擎通过多版本控制(multi versioning)的方式来读取当前执行时间数据库中的数据。如果被读的数据行被加了排他锁,在读取这行数据的时候并不会等待锁释放,而是读取该行的一个快照数据。 之所以称为非锁定读,因为不需要等待被访问行的X锁的释放。快照数据是指改行之前

1729

戴维南和诺顿定理到底怎么选?一个实际维修案例讲透两种等效电路用法

本文通过工业电源模块维修案例,详细解析戴维南和诺顿定理在实际电路分析中的选择策略。针对电压敏感型故障、电流分配问题及功率传输异常,提供三大黄金法则,帮助工程师高效选择等效电路方法,提升故障排查效率。特别强调诺顿定理在电流分析中的优势。

weixin_31854867的博客 357

MySQL 中非锁定一致性读(MVCC)

MySQL 中MVCC机制详细剖析

zwl2220943286的博客 1600

实战演练 | ABAQUS显式动力学分析在金属切削仿真中的应用

本文详细介绍了如何利用ABAQUS显式动力学分析进行金属切削过程的二维仿真。通过从零开始的完整流程,包括几何建模、材料本构与失效定义、网格划分、接触设置、边界条件施加,到结果后处理与切削力提取,为工程师和研究人员提供了实用的仿真方法,以优化刀具设计和加工工艺。

purple的博客 928

mysql 一致性非锁定读_一致性非锁定读与一致性锁定读

背景innodb存储引擎实现了两种标准的行级锁:S锁和X锁,S锁被称为共享锁,允许事务读一行数据,X锁被称为排它锁,允许事务删除或更新一行数据。一致性非锁定读指的是如果一条记录被加了X锁,其他事务还能读取这条记录。一致性锁定读指的是一个事务可以通过SELECT语句给某条记录加X锁或者X锁。一个小栗子我们假设有一个表和两个事务,表名字为mytest,事务名字为t1和t2:t1t2t3t4abbbbc...

weixin_29221191的博客 192

基于SolidWorks宏的草图点坐标自动化提取与Excel集成

本文详细介绍了如何利用SolidWorks宏编程实现草图点坐标的自动化提取并与Excel集成,显著提升机械设计效率。通过VBA代码解析与优化,解决了人工记录坐标耗时易错的问题,并扩展了多草图批量处理、数据可视化等高级功能,适用于数控加工、质量检测等场景。

weixin_29251131的博客 458

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 466

mysql官方文档翻译02-一致性非锁定读与一致性锁定读

参考资料::一致性读是一种读操作,它使用快照信息根据某个时间点呈现查询结果,不考虑其他事务同时执行的变更。如果查询的数据被另一个事务修改,则根据撤销日志内容重建原始数据。这种技术避免了一些锁定问题,这些问题可能会通过强行当前事务等待其他事务完成而降低并发度。在可重复读隔离级别下,快照的时间是根据第一次读取操作执行的时间点。而读已提交隔离级别下,快照的时间会重置为每次一致性读操作执行的时间点。在读已提交或可重复读隔离级别下,一致性读是innodb处理select语句的默认模式;

PacosonSWJTU的博客 1250

WinServer 2012 R2 搭建 AD 单域多站点 及 DNS各站点的子网掩码排序调整

WinServer 2012 R2 搭建 AD 单域多站点 及 DNS各站点的子网掩码排序调整

一直被模仿,从未被超越 5533

InnoDB一致性读与锁定读全解析

摘要:本文深入解析MySQL InnoDB的并发控制机制,重点介绍一致性非锁定读和锁定读的核心原理。一致性非锁定读通过MVCC实现不加锁的查询,读取事务开始时的数据快照;而锁定读(FOR SHARE/FOR UPDATE)则通过加锁确保数据一致性,适用于需要修改数据的场景。文章对比了不同隔离级别下的读行为差异,并详细说明了NOWAIT/SKIP LOCKED等特殊选项的适用场景。最后通过对比表格总结不同场景下的最佳实践,帮助开发者在高并发环境下平衡数据一致性和系统性能。(150字)

m0_37607945的博客 976

VXWorks6.9 + Workbench3.3 开发环境部署

VxWorks6.9 + Workbench3.3的安装部署,以及简单示例项目的创建、编译和运行

Mr.Sugarcane 5452

分布式爬虫架构实战:Scrapy+RabbitMQ+浏览器池,百万级数据抓取成本直降60%(附架构图+源码)

任务调度瓶颈:Redis 作为消息队列,不支持复杂任务优先级,高并发下容易消息堆积,且单点故障会导致全量任务丢失;资源浪费严重:每个爬虫节点每次爬取动态页面都启动新浏览器,启动耗时3-5秒,CPU 占用率高达80%+,单机最多同时跑3个浏览器;扩展性差:新增节点需要手动同步任务队列,节点忙闲不均,无法根据任务量动态分配资源。# 从settings读取RabbitMQ配置# 注册信号:爬虫关闭时关闭RabbitMQ连接"""启动时建立RabbitMQ连接"""

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1617

mysql 一致性非锁定读_MySQL——一致性非锁定读(快照读)&MVCC

MySQL——一致性非锁定读(快照读)MySQL数据库中读分为一致性非锁定读、一致性锁定读一致性非锁定读(快照读),普通的SELECT,通过多版本并发控制(MVCC)实现。一致性锁定读(当前读),SELECT ... FOR UPDATE/SELECT ... LOCK IN SHARE MODE/INSERT/UPDATE/DELETE,通过锁实现。本文主要介绍一下一致性非锁定读,简单看一下2个...

weixin_42414213的博客 425

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mysql一致性非锁定读和mvcc_MySQL——一致性非锁定读(快照读)&MVCC

MySQL——一致性非锁定读(快照读)MySQL数据库中读分为一致性非锁定读、一致性锁定读一致性非锁定读(快照读),普通的SELECT,通过多版本并发控制(MVCC)实现。一致性锁定读(当前读),SELECT ... FOR UPDATE/SELECT ... LOCK IN SHARE MODE/INSERT/UPDATE/DELETE,通过锁实现。本文主要介绍一下一致性非锁定读,简单看一下2个...

weixin_42503036的博客 419

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【MySQL技术内幕】36-一致性的非锁定读

这时如果在会话A中再次读取id为1的记录,根据 InnoDB存储引擎的特性,即在 READ COMMITTED和 REPEATETABLE READ的事务隔离级别下会使用非锁定的一致性读。然而,对于快照数据的定义却不相同。对于READ COMMITTED的事务隔离级别,它总是读取行的最新版本,如果行被锁定了,则读取该行版本的最新一个快照(fresh snapshot)。需要特别注意的是,对于READ COMMITTED的事务隔离级别而言,从数据库理论的角度来看,其违反了事务ACID中的I的特性,即隔离性。

smart_an的专栏 844

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Mysql的一致性非锁定读和一致性锁定读

一致性非锁定读 一致性非锁定读指的是:要读取的行被加了X锁(排它锁),这时候其他事务读操作不会等待行上锁的释放,而是会读取行的一个快照数据。如下图所示: 需要注意的一些点: ①每行记录可能有多个版本 ②在事务隔离级别READ COMMITTED (简写RC)和 REPEATABLE READ(简写RR)下,InnoDB存储引擎使用一致性非锁定读。但是对快照的定义却不相同。在RC下,...

MrLiar的博客 711

MySQL8.0的锁定读(for share、for update、NOWAIT、skip locked) 和 非锁定读

MySQL8.0的锁定读(for share、for update、NOWAIT、skip locked) 和 非锁定读 。

好玩的事情要记录下来~ 2815

MySQL知识点回顾:InnoDB的锁机制(二)一致性非锁定读和一致性锁定读

MySQL知识点回顾:InnoDB的锁机制(二)一致性非锁定读和一致性锁定读

weixin_36531037的博客 640

864-MySQL的一致性非锁定读与一致性锁定读

今天咱们花三分钟了解下数据库中的两种读(select)操作:一致性非锁定读 和 一致性锁定读 一致性非锁定读 一致性非锁定读是什么?这里我先给出一个最最最简单的解释:一致性非锁定读就是读快照! 快照即当前行数据之前的历史版本,每行记录可能存在多个历史版本,或者说每行记录可能有不止一个快照数据,一般我们将这种技术称为 行多版本技术。而由于一个行记录可能对应着多个快照(历史版本),为此不可避免地会带来一系列的并发问题,如何解决这些并发问题,就是所谓的 多版本并发控制(MVCC),当然,这不是本文的重点。 在不同

LINZEYU666的博客 228

MySQL锁(lock和latch、锁的粒度、InnoDB锁的类型、一致性非锁定读、一致性锁定读)

什么是锁 锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问,提供数据的完整性和一致性。 虽然现在数据库系统做的越来越类似,但是有多少种数据库,就可能有多少种锁的实现方式。 对于MyISAM引擎,其锁是表锁设计,并发情况下读没有问题,但是并发插入时的性能相对较差。 InnoDB存储引擎锁的实现和Oracle数据库非常类似,提供一致性的非锁定读、行级锁支持。行级锁没有相关...

baolingye的博客 1913

【Mysql一本通-32 完结篇】一致性非读定锁和一致性读定锁

这种类型的读操作通常会阻塞其他事务对同一数据的修改或读取,直到当前事务完成。每个事务都有自己的数据版本,读取时事务会根据自己的快照来读取数据,而不被其他事务的修改所影响。查询时,InnoDB 会对相应的数据行加排他锁(X 锁),阻止其他事务对同一数据进行修改。通过理解这两种操作的区别,可以在不同的并发场景中选择合适的读取方式,达到最佳的性能与数据一致性保证。,它通过 MVCC 确保事务在执行期间的一致性,并且在没有加锁的情况下能够读取数据。是两种常见的读操作,涉及如何保证事务隔离和数据一致性。

m0_69378371的博客 703

mysql+一致性非锁定读_MySQL中一致性非锁定读

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这是读取操作不会因此等待行上锁的释放。相反的,InnoDB会去读取行的一个快照数据上面展示了InnoDB存储引擎一致性的非锁定读。之所以称为非锁定读,因为不需要...

weixin_29046611的博客 174
上一篇: MySQL(四)多版本并发控制 ----- MVCC
下一篇: RabbitMQ(二)消息可靠投递
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值