Mysql锁机制简介

news2024/11/27 23:33:08

一、什么是锁

锁是系数据库统区别于文件系统的一个关键特性。

锁机制用于管理对共享资源的并发访问,提供数据的完整性和一致性。

InnoDB存储引擎不仅会在行级别上对表数据上锁,还会在数据库内部其他多个地方使用锁,从而允许对多种不同资源提供并发访问。如:操作缓冲池中LRU列表,删除、添加、移动LRU列表中的元素,为了保证数据的完整性,必须有锁的介入。

InnoDB存储引擎锁的实现与Oracle类似,提供一致性的非锁定读、行级锁支持。

有多少种数据库,就可能有多少种锁的实现方法。

二、InnoDB存储引擎中的锁

2.1 锁的类型

2.1.1 InnoDB存储引擎实现了如下两种标准的行级锁:

共享锁(S Lock),允许事务读一行数据。

排他锁(X Lock),允许事务删除或者更新一行数据。

2.1.2 用户可以通过以下方式查看当前锁请求的信息

show engine innodb status;
information_schame下的表innodb_trx、innodb_locks、innodb_lock_waits
(
mysql> select * from innodb_trx\G          ### 只显示了当前运行的innodb事务
mysql> select * from innodb_locks\G        ### 直接反映了锁的一些情况
mysql> select * from innodb_lock_waits\G    ### 事务量大时,直观反映当前事务的等待
)

复制

例子:

只显示了当前运行的innodb事务,并不能直接判断锁的一些情况。

事务trx_id=730FEE向表parent加了一个X的行锁, 事务trx_id=7311F4向表parent申请了一个S的行锁, lock_date=1表示都申请表parent中主键=1这一行

2.2 一致性非锁定读

InnoDB存储引擎下,这是默认的读取方式。即:读取不会占用和等待表上的锁。 定义:如果读取的行正在执行update或delete操作,这时读取的操作不会因此去等待行上锁的释放,而是去读取行的快照数据(该行之前的数据,通过undo段来实现;一个行记录可能不止一个快照数据,一般称这种技术为多版本并发控制MVCC)。 使用:事务隔离级别read committed和repeatable read(innodb默认存储引擎)。 RC下,对于快照数据,非一致性读总是读取被‘锁定行的最新一份快照数据’。 RR下,对于快照数据,非一致性读总是读取‘事务开始是的行数据版本’。

例子:

时间5:RC、RR下结果id=1 ; 时间6:RC下结果为空,RR下结果id=1。

2.3 一致性锁定读

定义:某些情况下,用户需要对数据库读取操作进行加锁以保证数据逻辑的一致性。 加锁语句:  select ... for update; ### 对读取的行记录加一个X锁  select ... lock in share mode; ### 对读取的行记录加一个S锁

说明:以上加锁语句必须在一个事务中,当事务提交,锁就释放了(在使用锁定语句时,务必加上begin,start transaction, set autocommit=0)

复制

三、锁问题

锁机制会造成如下问题:

3.1 脏读

脏页 : 在缓冲池中已经被修改的页,但是还没有刷新到磁盘中,即:数据库实例内存中的页和磁盘中的页的数据是不一致的,当然在刷新到磁盘之前,日志已经备写入到了重做日志(redo log)中。 说明:对于脏页的读取,是很正常的。它是由于数据库实例内存和磁盘的异步造成的,最终脏页会刷回磁盘,并不影响数据的一致性。

脏数据:指事务对缓冲池中行记录的修改,并且还没有被commit。 说明:如果读取到了脏数据,即一个事务可以读到另外一个事务未提交的数据,这显然违背了数据库的隔离性。

脏读:就是早不同的事务下,当前事务可以读到另外事务未提交的数据(read uncommited事务隔离级别下)。

3.2 不可重复读

不可重复读:在同一事务中,两次读取同一数据,得到内容不同

        事务1:查询一条记录
                        -------------->事务2:更新事务1查询的记录
                        -------------->事务2:调用commit进行提交
        事务1:再次查询上次的记录
        
        ***此时事务1对同一数据查询了两次,可得到的内容不同,称为不可重复读

复制

不可重复读与脏读的区别:脏读是读到未提交的数据,而不可重复读读到的却是已经提交的数据,但是违反了一致性的要求。

3.3 幻读

幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同

        事务1:查询表中所有记录
                          -------------->事务2:插入一条记录
                          -------------->事务2:调用commit进行提交
        事务1:再次查询表中所有记录
        
        ***此时事务1两次查询到的记录是不一样的,称为幻读

复制

详细解释:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

不可重复读与幻读的区别 不可重复读的重点是修改:同样的条件, 你读取过的数据,再次读取出来发现值不一样了 幻读的重点在于新增或者删除:同样的条件, 第 1 次和第 2 次读出来的记录数不一样

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

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

相关文章

【项目实战】一、Spring boot整合JWT、Vue案例

前言 通过Spring boot整合JWT、Vue案例,其中融合了微服务网关、微服务等。 1、若无公共模块,先添加公共模块 1.1、创建模块:common-service 1.2、修改父项的pom文件 1.2.1、给springCloud父项添加子模块 1.2.2、添加common-service的全局…

FinClip | 日子过的飞快,又来汇报了

FinClip 的使命是使您(业务专家和开发人员)能够通过小程序解决关键业务流程挑战,并完成数字化转型的相关操作。不妨让我们看看在本月的产品与市场发布亮点,看看是否有助于您实现目标。 产品方面的相关动向👇&#x1f…

【021】C/C++字符串处理函数

C/C字符串处理函数 引言一、字符串操作函数1.1、测量字符串的长度strlen1.2、字符串拷贝函数strcpy1.3、字符串追加函数strcat1.4、字符串比较函数strcmp 二、字符串查找函数2.1、字符串查找字符函数strchr2.2、字符串查找子串函数strstr 三、其他字符串处理函数3.1、字符串分割…

结构型设计模式04-适配器模式

🧑‍💻作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 适配器模式 1、适配器模式介绍 适配器模式(Adapter Pattern)是一种结构型设计…

chatgpt赋能python:用Python实现文本数字转换:从123到一二三

用Python实现文本数字转换:从123到一二三 在网站开发中,我们经常需要将数字转换成文字,比如将123转成“一百二十三”。这种数字转文字的需求,既方便了用户的阅读,也提高了网站的可读性和SEO效果。 在本文中&#xff…

定时任务原理方案综述 | 京东云技术团队

本文主要介绍目前存在的定时任务处理解决方案。业务系统中存在众多的任务需要定时或定期执行,并且针对不同的系统架构也需要提供不同的解决方案。京东内部也提供了众多定时任务中间件来支持,总结当前各种定时任务原理,从定时任务基础原理、单…

excel中的vlookup函数使用,查找对应信息

简单做一个小表格,第一列序号、第二列姓名、第三列数值 显然我这里都乱序了,是为了更好的展示 vlookup函数是查找函数的一种,有四个参数: VLOOKUP(lookup_value,table_array,col_index_num,range_lookup) lookup_value&#xf…

【算法与数据结构】206、LeetCode 反转链表

文章目录 一、题目二、翻转链表双指针法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、翻转链表双指针法 思路分析:代码首先进行头结点合法性判断,如果是空链表或者仅有一个节点的链…

SpringBoot + minio实现分片上传、秒传、续传

什么是minio MinIO是一个基于Go实现的高性能、兼容S3协议的对象存储。它采用GNU AGPL v3开源协议,项目地址是https://github.com/minio/minio。 引用官网: MinIO是根据GNU Affero通用公共许可证v3.0发布的高性能对象存储。它与Amazon S3云存储服务兼容…

SpringBoot SpEL表达式(五十二)

当死亡笼罩在脑海,请用生的信念打败它 上一章简单介绍了SpringBoot 事件监听处理(五十一), 如果没有看过,请观看上一章 一. 解析器 我们在生活中,常常会用到表达式计算, 如 传入一个字符串 abcd, 然后指定 a,b,c,d 的值。 让其计算出最后的…

2023年律师事务所研究报告

第一章 行业概况 律师事务所行业是一个关键的法律服务提供者,为客户提供各种法律咨询、代理和解决纠纷的服务。律师事务所是由一群经验丰富的律师和法律专业人员组成的机构,他们具备广泛的法律知识和专业技能。 律师事务所在各个领域都扮演着重要的角色…

信捷PLC中A_PLSF指令的加减速时间设置简析

我们在使用信捷PLC通过ethercat总线控制伺服驱动器时,可能会需要用到其用于轴控制的指令: A_PLSF,即“可变速度输出”。 这个指令的特点是运行过程中,速度可以实时改变,实时生效,不需要重新触发。 既然是速度指令,肯定需要设置加减速时间,因为根据实际负载的不同,使用…

30分钟Cadence原理图入门

新建工程 点击Design Entry CIS图标,选择OrCAD Capture。 新建工程File->New->Project 设置工程名字和路径。 默认生成PAGE1 新建页 右键点击SCHEMATIC1->New Page,新建原理图页。 页面设置 修改原理图页大小 选择大小A、B、C、D、E或自定义…

uniapp与webview网页交互打开手机扫码

公司的uniapp项目有一个专门打开网页的功能,uniapp通过webview去打开对应的url,然后通过监听webview网页发送过来的事件,在uniapp手机端打开手机的扫码功能,然后将扫码识别到的结果传回给网页。 思路 1.网页引入uni.webview.js文…

【HTML】【一文全解Canvas】从初学到实战,彻底掌握前端绘图神器!

【HTML】Canvas 基本介绍与应用 前言一、Canvas 概述二、在 HTML 中使用 Canvas三、Canvas 绘制图形1、绘制矩形a. fillRect()b. strokeRect() 2、绘制圆形a. 绘制实心圆形b. 绘制空心圆形 四、Canvas 绘制文本1、 fillText()2、 strokeText() 五、Canvas 绘制图片1、drawImage…

vue中安装使用Mock来模拟数据(详细教程)

在做前后分离的项目时候,比如制作VUE项目,很多时候后端没有提供接口,前端人员可以自己通过mock来造一个接口,返回数据 操作步骤 1) 安装mockjs和axios: npm install mockjs -S npm install axios -S &…

怎么翻译文档?翻译文档的方法你知道几种?

文档翻译在现代社会中已经成为一项重要的工作,随着全球化的加速和跨境交流的增多,越来越多的公司和组织需要将自己的文件、资料等内容进行翻译,以便更好地与国际市场接轨。而如何进行高质量的文档翻译,一直是许多人所关注的问题。…

webstorm+小程序相配合来开发小程序

前言: webstorm可以安装的一个小程序插件: wechat-miniprogram-plugin ,来实现小程序语法的高亮,并识别 rpx 这种小程序专有单位,还可以实现跟开发者工具中一些类似的操作功能。 注意事项: 1、小程序的根目…

使用 javascript 将鼠标指针移动到特定位置

文章目录 使用一些 CSS 样式创建基本的 HTML 结构使用 JavaScript 将鼠标指针移动到特定位置总结 请注意 ,无法将鼠标指针移动到 JavaScript 中的特定位置。 主要原因是它会给用户带来安全问题并损害用户体验。 在这篇文章中,我们将创建一个假的或自定义…

华为OD机试真题 Java 实现【字符串加密】【2023Q1 100分】,附详细解题思路

一、题目描述 有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,将所得结果作为新字母表开头,并将新建立的字母表中未出现的字母按照正常字母表顺序加…