MySQL原理(三)锁定机制(1)综述
一、介绍:
1、锁的本质
业务场景中存在共享资源,多个进程或线程需要竞争获取并处理共享资源,为了保证公平、可靠、结果正确等业务逻辑,要把并发执行的问题变为串行,串行时引入第三方锁当成谁有权限来操作共享资源的判断依据。因为数据库是多用户共享资源的,在并发环境下会破坏数据库的一致性,所以需要锁来控制它们。数据库锁机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。
2、mysql术语
(1)DDL
data manipulation language, 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是用来对 数据库里的数据 进行操作的语言;
(2)DML
data definition language, DDL比DML要多,主要的命令有CREATE、ALTER、DROP等,DDL主要是用在 定义或改变表(TABLE)的结构 ,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用;
(3)DCL
Data Control Language,是数据库控制功能。是用来设置或更改数据库用户或角色权限 的语句,包括(grant,deny,revoke等)语句。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL
二、按操作的颗粒分类
MySQL 数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。
| 存储引擎 | 表级锁 | 行级锁 | 页面锁 |
|---|---|---|---|
| MyISAM | √ | × | × |
| InnoDB | √ | √ | × |
| MEMORY | √ | × | × |
| BDB | √ | × | √ |
详见MySQL原理(三)锁定机制(2)表锁行锁与页锁-CSDN博客
三、按操作的类型分类
锁类型按照 操作类型划分 有「读锁(S锁),写锁(X锁)」,其实它们与共享锁,排他锁是一个意思,只是不同叫法而已。

1、共享锁(读锁/S锁)
共享锁(Shared Lock)又称为读锁,简称S锁,是一种行级锁。
共享锁 就是多个事务对于同一数据共享一把锁,都能访问到数据,但是只能读不能修改。
# 加锁方式
select ... from ... lock in share mode;# 事务提交或回滚释放:
commit;
rollback;
2、排他锁(写锁/X锁)
排他锁(EXclusive Lock)又称为写锁,简称X锁,是一种行锁也可以是表锁。
排他锁 就是不能与其他锁并存,即当前写操作没有完成前,会阻断其他写锁和读锁。
注意:其他事务不加锁的读是不会被阻塞的,阻塞的是加锁的读
# 加锁方式:
# innodb引擎默认会在update,delete语句加上 for update
SELECT * FROM student FOR UPDATE; # 排他锁
INSERT INTO student values ... # 排他锁
DELETE FROM student WHERE ... # 排他锁
UPDATE student SET ... # 排他锁# 事务提交或回滚释放:
commit;
rollback;
共享锁和排他锁的互斥关系:共享锁与共享锁之前兼容,排他锁不能与其他锁并存。意向锁之间是互相兼容的,意向锁与普通的表级排他锁/表级共享锁互斥(意向锁不会与行级的共享锁/排他锁互斥)。
3、意向锁(表锁)
意向锁(Intention Lock) 简称 I锁,是表级锁的一种,它是由数据库引擎自行维护的,用户自己无需也无法操作意向锁。
意向锁 能够将 检查行锁 的时间复杂度由 O(n) 变成 O(1),其加锁的具体做法就是,当一个事务想要获取表中某一行的(共享/排他)锁的时候,它会自动尝试给当前表的加上意向(共享/排他)锁,用于防止全表扫描的一种锁。
(1)意向共享锁(IS锁-表级锁)
意向共享锁(Intention Shared Lock) 简称IS锁,事务想要给某一个数据行加行级共享锁(S锁)之前必须先获取该表的IS锁(表级锁)
(2)意向排他锁(IX锁-表级锁)
意向排他锁(Intention EXclusive Lock) 简称IX锁,事务想要给某一个数据行加行级排他锁(X锁)之前必须先获取该表的IX锁(表级锁)
4、意向锁的兼容互斥性
意向锁之间的兼容互斥性:意向锁之间是互相兼容的。

意向锁与其他锁兼容互斥性:意向锁与普通的排他锁/共享锁互斥(这的排他锁(X锁)共享锁(S锁)指的都是表锁,意向锁不会与行级的共享锁/排他锁互斥。上面表锁部分讲到的 显式加锁 加的就是排他锁/共享锁)。

四、按操作的性能分类
从操作的性能可分为乐观锁和悲观锁。乐观锁/悲观锁其实都是概念上的,只是在并发下防止数据被修改的一种加锁形式。
| 不同点 | 乐观锁 | 悲观锁 |
|---|---|---|
| 实现方式 | 乐观锁需要自己实现,且外部系统不受控制,没有加锁和解锁操作,可以提高吞吐量。 | 每次请求都需要加锁、释放锁,这个过程会降低系统性能。单可以保证数据的独占性和正确性。 |
| 实现方式 | 有version方式(常用)和CAS算法两种实现方式。 | 依靠数据库提供的锁机制实现。 |
| 应用场景 | 读多写少 。 | 写多读少。 |
相关文章:
MySQL原理(三)锁定机制(1)综述
一、介绍: 1、锁的本质 业务场景中存在共享资源,多个进程或线程需要竞争获取并处理共享资源,为了保证公平、可靠、结果正确等业务逻辑,要把并发执行的问题变为串行,串行时引入第三方锁当成谁有权限来操作共享资源的判…...
Qt知识点总结
将枚举类型转换为字符串 这里使用的在网络编程中,获取socket状态并显示的时候,遇到的一个问题 #include <QMetaEnum>// 将枚举类型转换为字符串 QMetaEnum metaEnum QMetaEnum::fromType<QAbstractSocket::SocketState>(); const char *c…...
什么是系统工程(字幕)13
0 00:00:00,670 --> 00:00:01,582 如果不加图 1 00:00:01,582 --> 00:00:02,130 怎么加 2 00:00:02,130 --> 00:00:03,225 我们来看一下 3 00:00:03,225 --> 00:00:03,590 你看 4 00:00:03,980 --> 00:00:06,720 右键点这个,添加元素 5 00:00:0…...
qt学习:Table widget控件
目录 头文件 实战 重新配置ui界面 添加头文件 在构造函数中添加初始化 显示方法 该实例是在sqlite项目上添加qt学习:QTSQL连接sqlite数据库增删改查-CSDN博客 头文件 #include <QTableWidgetItem> 实战 重新配置ui界面 用法介绍,可以双击…...
Android --- Content Provider是使用示例,通俗易懂
当两个应用程序之间需要共享数据时,可以通过 Content Provider 来实现。在这个示例中,我们将创建一个简单的 Content Provider,让 App_B 暴露人口总数的数据,并由 App_A 来获取这个数据。 首先,我们来创建一个简单的示…...
02-opencv简单实例效果和基本介绍-上
机器视觉概述 机器视觉是人工智能正在快速发展的一个分支。简单说来,机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是通过机器视觉产品(即图像摄取装置,分CMOS和CCD两种)将被摄取目标转换成图像信号,传送给专用的图像处理系统,得到被摄目标的形态信息,根据像素…...
中科大计网学习记录笔记(一):Internet | 网络边缘
计算机网络 前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面…...
Shell脚本——免交互
目录 一、Here Document免交互 1、免交互概述 2、语法格式 2.1示例:免交互方式实现对行数的统计,将要统计的内容置于标记EOF之间,直接将内容传给wc-l来统计 3、变量设定 ①变量图换成实际值 ②整行内容作为变量并输出结果 ③使输出内…...
【数据分享】1929-2023年全球站点的逐月最高气温数据(Shp\Excel\无需转发)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据! 之前我们分享过1929-2023年全球气象站…...
CentOS gui 图形界面显示文字乱码
一、现象 CentOS(CentOS 7.5)控制台下显示中文乱码: 或者通过X11 Forwarding远程显示CentOS的图形化程序文字乱码: 二、解决方法 安装中文语言包: yum install kde-l10n-Chinese 注:网上有些文章会推荐安…...
[Vue入门]Vue的使用:vue对象+data+el+插值表达式
总结性内容: 1.想让Vue工作,就必须创建一个Vue的实例,而且要传入一个配置对象 2.root容器中的代码依然符合html规范,只不过混入了一些特殊的Vue语法 3.root容器里的代码被称为Vue模板 <!DOCtype html> <html><head><meta charset"UTF-8">&l…...
Tomcat运维
目录 一、Tomcat简介 二、系统环境说明 1、关闭防火墙,selinux 2、安装JDK 3、安装Tomcat 三、Tomcat目录介绍 1、tomcat主目录介绍 2、webapps目录介绍 3、Tomcat配置介绍(conf) 4、Tomcat的管理 四、Tomcat 配置管理页面(了解) …...
前端开发基于Qunee绘制网络拓扑图总结-02
1、渲染连线颜色 *关键函数一定要调用:graph.invalidate()* graph.forEach(function(element) {if (element instanceof Q.Edge) {let arr [#549BF1, #AA8A6E, #8F54F1,#5A70BC,#BCBF5C, #BC5A76, #67B4D4,#B4C9EF, #676AD4, #A86EAA,#5CBF7F, #EFB4B4];let inde…...
牛客——中位数图(连续子数组和二维前缀和)
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。 输入描述: 第一行为两个正…...
Java:搭建eladmin复习mvn、springboot、vue等
目录 1.源码平台后端: 2.源码平台前端: 3.操作系统:centos7.9 4.mysql:5.7.x 安装 5.redis:5.0.X 6.maven:3.8 7.java:1.8: 8.nodejs:16.x 9.通过mvn打包eladmin后端 10.npm打包前端项目进行部署 11.访问测试…...
JavaScript入门
第二个知识点:javascript的基本语法 定义变量 在JavaScript里面,没有int,string 之类的数据类型,只有 var var num 1; var string "天玄地号"; 在javascript中,写完一句语句之后可以不加分号ÿ…...
Redis单机-主从集群-哨兵集群-分片集群 搭建教程
Redis集群 本章是基于CentOS7下的Redis集群教程,包括: 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖: yum install -y gcc tclredis-6.2.4.tar.gz 然后将Redis安装包上传到虚拟机的任意目录&am…...
湘潭大学-计算机网络-补考
背景 卷面分23,平时分85,各占百分之50,最终54,遗憾挂科 大学第一次补考 计划 首先把湖科大教书匠的计算机网络视频看一遍,并做一些笔记 然后看教材 刚看到老师说最好的复习资料是书和课后作业(想起来…...
SOME/IP SD 协议介绍(五)使用SOME/IP-SD宣布非SOME/IP协议的协议。
使用SOME/IP-SD宣布非SOME/IP协议的协议。 除了SOME/IP之外,车辆内部还使用其他通信协议,例如用于网络管理、诊断或闪存更新。这些通信协议可能需要传递服务实例或具有事件组。 对于非SOME/IP协议,应使用特殊的服务ID,并使用配置…...
svn 安装路径
SVN客户端安装(超详细) 一、SVN客户端安装 1、下载安装包地址:https://tortoisesvn.net/downloads.html 此安装包是英文版的,还可以下载一个语言包,在同界面的下方 一直点击下一步,直到弹出选择红框 然…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
