mysql有哪些锁,理解各种表锁和行锁

全局锁

主要用于数据库的备份,但会使得备份期间不能有任何事务插入删除更新数据,这很影响实际业务。所以通常不用这个全局锁来完成数据库的备份。假设数据库的存储引擎支持可重复读,那么常见的方法是通过MVCC来实现的,也就是备份事务开始时候创建一个read view,然后根据这个read view来备份,这样不影响其他事务的更新。

表级锁

表锁

基本不用,太拉了。共享锁(读锁)和独占锁(写锁),一个事务申请了表锁,不仅限制别的事务读写,还会限制自己的读写。

元数据锁(MDL)

不需要显式的加MDL,会自动加:

  • 对一张表进行 CRUD 操作时,加的是 MDL 读锁;
  • 对一张表做结构变更操作的时候,加的是 MDL 写锁;
    主要目的是防止
    用户对表执行 CRUD 操作时,防止其他线程对这个表结构做了变更。

当有线程在执行 select 语句( 加 MDL 读锁)的期间,如果有其他线程要更改该表的结构( 申请 MDL 写锁),那么将会被阻塞,直到执行完 select 语句( 释放 MDL 读锁)。

反之,当有线程对表结构进行变更( 加 MDL 写锁)的期间,如果有其他线程执行了 CRUD 操作( 申请 MDL 读锁),那么就会被阻塞,直到表结构变更完成( 释放 MDL 写锁)。
MDL 是在事务提交后才会释放,这意味着事务执行期间,MDL 是一直持有的。这也就意味着假设A事务读表,B事务可以读,但C事务想改就不行会被阻塞,此后DEF事务想读都不行了,因为C要写而且排在他们前面。数据库线程会很快爆满。

意向锁

意向锁是指有事务想修改或者读取表的某一部分,会先加个意向锁然后再加行锁。实际上用意向锁就是告诉后续有事务想申请表级独占锁(X,写锁)或者共享锁(S,读锁),不行,这里有人在用。当然了,行锁和表锁还是满足读读共享、读写互斥、写写互斥的。
在这里插入图片描述

AUTO-INC锁

表里的主键通常是自增的。插入时候不显式赋值,主键也能完成自增,靠的就是这个AUTO-INC锁。锁的释放不是事务终止才释放的,是插入完成后就释放。但这样不同事务在插入数据时候会相互阻塞。所以不太合适。因此innoDB引入了一种轻量级锁innodb_autoinc_lock_mode,在插入时候,自增字段赋值结束后就释放锁,而不用等到语句整个插入完。
在这里插入图片描述
当 innodb_autoinc_lock_mode = 2 是性能最高的方式,但是当搭配 binlog 的日志格式是 statement 一起使用的时候,在「主从复制的场景」中会发生数据不一致的问题。看下面例子。
在这里插入图片描述
session B 先插入了两个记录,(1,1,1)、(2,2,2);
然后,session A 来申请自增 id 得到 id=3,插入了(3,5,5);
之后,session B 继续执行,插入两条记录 (4,3,3)、 (5,4,4)。
可以看到,session B 的 insert 语句,生成的 id 不连续。

当「主库」发生了这种情况,binlog 面对 t2 表的更新只会记录这两个 session 的 insert 语句,如果 binlog_format=statement,记录的语句就是原始语句。记录的顺序要么先记 session A 的 insert 语句,要么先记 session B 的 insert 语句。

但不论是哪一种,这个 binlog 拿去「从库」执行,这时从库是按「顺序」执行语句的,只有当执行完一条 SQL 语句后,才会执行下一条 SQL。因此,在从库上「不会」发生像主库那样两个 session 「同时」执行向表 t2 中插入数据的场景。所以,在备库上执行了 session B 的 insert 语句,生成的结果里面,id 都是连续的。这时,主从库就发生了数据不一致。

要解决这问题,binlog 日志格式要设置为 row,这样在 binlog 里面记录的是主库分配的自增值,到备库执行的时候,主库的自增值是什么,从库的自增值就是什么。

所以,当 innodb_autoinc_lock_mode = 2 时,并且 binlog_format = row,既能提升并发性,又不会出现数据一致性问题。

行级锁

innoDB独有的额,MyISAM没有
在这里插入图片描述

Record Lock

记录锁、行锁,也就是仅仅把一条记录锁上。主要是对删除和修改的限制。

  • 当一个事务对一条记录加了 S 型记录锁后,其他事务也可以继续对该记录加 S 型记录锁(S 型与 S 锁兼容),但是不可以对该记录加 X型记录锁(S 型与 X 锁不兼容);
  • 当一个事务对一条记录加了 X 型记录锁后,其他事务既不可以对该记录加 S 型记录锁(S 型与 X
    锁不兼容),也不可以对该记录加 X 型记录锁(X 型与 X 锁不兼容)。

Gap Lock

间隙锁,锁定一个范围,但是不包含记录本身。主要是对插入的限制,用于解决幻读。
间隙锁虽然存在 X 型间隙锁和 S 型间隙锁,但是并没有什么区别,间隙锁之间是兼容的,即两个事务可以同时持有包含共同间隙范围的间隙锁,并不存在互斥关系,因为间隙锁的目的是防止插入幻影记录而提出的。

Next-Key Lock

record lock + gap lock,锁定一个范围,并且锁定记录本身。(x, y]区间内既不能插入也不能删除修改。

插入意向锁

和意向锁名字很像,但是行级别的锁。A事务间隙锁上了一个区间,B事务想在区间内插入一行数据,就会先申请一个插入意向锁。表明有事务想在某个区间插入新记录,但是现在处于等待状态。但注意A和B不能是同一事务。

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

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

相关文章

解决ant-design-vue中Select组件v-model值为空字符串不显示placeholder的bug

方法一: 1.找到node_modules/ant-design-vue/es/vc-select/SingleSelector.js文件 搜索renderPlacehoder方法 将其修改为 const renderPlacehoder () > {const list props.values.filter(val > val.value ! );if (list[0]) {return null}... }2.在此文件中…

springboot遇到的问题02

问题1 JsonFormat(patter"yyyy-MM-dd HH:mm:ss") 这种返回给前端,时间可能会相差8个小时,,,因为JsonFormat 默认的timeZone 是 GMT (即标准时区),会造成输出少8个小时 修改为:JsonFor…

ROS2教程05 ROS2服务

ROS2服务 版权信息 Copyright 2023 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. The author holds all right…

Dockerfile脚本编写流程及示例

学习dockerfile指令 Dockerfile 指令 说明 FROM 指定基础镜像 MAINTAINER 声明镜像的维护者 LABEL 添加元数据标签 RUN 在容器中执行命令 CMD 容器启动后默认执行的命令 EXPOSE 暴露容器的端口 ENV 设置环境变量 ADD 将文件、目录或远程文件添加到容器中 COP…

Maxwell学习笔记

1 概述 Maxwell 是由美国 Zendesk 开源,用 Java 编写的 MySQL 实时抓取软件。 实时读取MySQL 二进制日志 Binlog,并生成 JSON 格式的消息,作为生产者发送给 Kafka,Kinesis、RabbitMQ、Redis、Google Cloud Pub/Sub、文件或其它平台…

选择测试自动化工具的4个技巧

预计至2026年,全球软件测试自动化市场价值将超过499亿美元,这意味着市场上的自动化测试工具数量也将同步增长。在这样的情况下,企业该如何选择最适合自己的自动化测试工具呢? 什么是测试自动化工具 数字经济迫使几乎每个企业都创建…

InnoDB的锁

自增锁 自增锁是一种特殊的表级别锁(table-level lock),专门针对事务插入 AUTO_INCREMENT 类型的列。最简单的情况,如果一个事务正在往表中插入记录,所有其他事务的插入必须等待,以便第一个事务插入的行&a…

arcgis投影栅格不可用

1、使用【投影栅格】工具进行栅格数据投影转换时报错。 解决方法:如果使用的是arcgis10.5及以下的版本,则需要更换更高的版本,因为这个是软件问题,需要更换到arcgis10.6及以上版本,更高级别的版本已经修复了这个问题。…

优酷新国风动漫《师兄啊师兄 第二季》强势定档 看李长寿稳健归来!

看新国风,上优酷动漫!由优酷出品,玄机科技制作,改编自阅文集团旗下起点读书小说《我师兄实在太稳健了》(作者:言归正传)的修仙喜剧动画《师兄啊师兄》第二季《海神扬名篇》今日正式官宣定档&…

HCIP —— 重发布

目录 路由重发布背景: 路由重发布的作用: ​编辑 部署条件: 1.必须存在ASBR设备 2.需要关注种子度量值 重发布的规则 重发布的名词 重发布的方向性问题(单向/双向) 重发布的ASBR数量问题 单点---只存在一个AS…

在ubuntu安装lighttpd时的一些错误记录和开发中的一些思考

今天在ubuntu安装lighttpd时的一些错误记录和开发中的一些思考。 相关平台:ARMv7,需要交叉编译,适用于ARM平台,其它平台可参考 交叉编译lighttpd先安装pcre支持,安装pcre却不顺利。错误一:Makefile:1438: recipe for …

陀螺仪防抖术语

陀螺仪防抖术语 fov 视场角 drift 零偏   MotionFusion即运动传感器的融合补偿,对陀螺仪、加速度计等运动测量器件的数据 进行预处理,通过标定和补偿,为防抖提供校准后的陀螺仪数据 ratio 系数 gyro 陀螺仪 calibration 校准 标定 DIS&…

SpringBoot整合Logback

什么是Logback Logback是日志框架SLF4J的一个实现&#xff0c;它被设计用来替代log4j。 引入依赖 SpringBoot默认使用Logback&#xff0c;所以加入了spring-boot-starter-web依赖后&#xff0c;他会自动包含Logback相关依赖&#xff0c;无需额外添加<dependency><g…

实力出圈,开源网安连续4年入选中国网络安全企业100强

近日&#xff0c;安全牛第十一版《中国网络安全企业100强》正式发布。开源网安突出的综合实力、技术创新能力&#xff0c;以及前沿技术的落地应用成果&#xff0c;再次受到权威认可&#xff0c;从数百家安全厂商中脱颖而出&#xff0c;连续多年上榜百强榜单。 《中国网络安全企…

2023年个人工作总结怎么写?工作任务完成自动记录的待办软件

2023年已经接近尾声&#xff0c;不少人已经开始期待新的一年到来了。不过对于大多数职场人士来说&#xff0c;最近还有一项让人头疼的任务需要完成&#xff0c;这就是撰写2023年个人工作总结。 那么年度个人工作总结怎么写呢&#xff1f;其实很简单&#xff0c;年度工作总结一…

【软件安装】在vm上安装Centos操作系统

文章目录 下载iso镜像安装 下载iso镜像 centos下载地址&#xff1a;阿里巴巴centos下载地址 安装 基本按照下面的步骤走就可以了 新手一般建议典型就可以了&#xff0c;而且自定义也改不了什么东西&#xff0c;没太大必要 选择自己下载的iso镜像文件 用户名和密码 安装位置 指…

前端知识笔记(三十二)———TCP 连接建立

&#xff1a;TCP 三次握手过程是怎样的&#xff1f; 客户端和服务端都处于 CLOSE 状态&#xff0c;服务端主动监听某个端口&#xff0c;处于 LISTEN 状态 第一次握手&#xff1a;客户端带着序号和SYN为1&#xff0c;把第一个 SYN 报文发送给服务端&#xff0c;客户端处于 SYN-S…

webGL开发虚拟实验室技术方案

开发虚拟实验室涉及到模拟实际实验环境和过程&#xff0c;同时提供用户互动性和学习体验。以下是一个可能的技术方案&#xff0c;用于实现这样的虚拟实验室&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

pwgen 随机密码生成

yum install -y pwgen apt install -y pwgen pwgen -h 用法&#xff1a;pwgen [选项] [密码长度] [密码数量] pwgen 支持的选项&#xff1a; -c 或 --capitalize 在密码中至少包含一个大写字母。 -A 或 --no-capitalize 不在密码中包含大写字母。 -n 或 --numerals 在密码中至…

【EI会议征稿中】第五届人工智能与机电自动化国际学术会议(AIEA 2024)

第五届人工智能与机电自动化国际学术会议&#xff08;AIEA 2024&#xff09; 2024 5th International Conference on Artificial Intelligence and Electromechanical Automation 第五届人工智能与机电自动化国际学术会议&#xff08;AIEA 2024&#xff09;将于2024年3月8-10…