拒绝零散碎片, 一文理清MySQL的各种锁
系列文章目录
学习MySQL先有全局观,细说其发展历程及特点
Mysql常用操作,谈谈排序与分页
拒绝零散碎片, 一文理清MySQL的各种锁(收藏向)
- 系列文章目录
- 一、MySQL的锁指什么
- 二、排他与共享
- 三、全局锁(Global Lock)
- 四、表锁(Table Lock)
- 五、意向锁(Intention Locks)
- 六、行级锁(Row Lock)
- 1. 记录锁(Record Locks)
- 2. 间隙锁(Gap Locks)
- 3. 临键锁(Next-Key Locks)
- 4. 插入意向锁(Insert Intention Locks)
- 5. 行锁总结
- 七、自增锁(AUTO-INC Locks)
相信大家在日常使用Mysql的过程中,对锁也有着一些了解。什么排它/共享锁,表锁、行锁,还有意向锁之类的。相信同学们也看到过很多相关文章,不过大部分文章只是偏重其中某一种锁进行深入分析,实话实说,确实有不少锁的逻辑较为复杂,值得摸索。但对于大部分同学而言,我认为最好是先对这些锁有个总体的认知,做到先总再分,这样才更能从全局了解锁的设计。
📕作者简介:战斧,从事金融IT行业,有着多年一线开发、架构经验;爱好广泛,乐于分享,致力于创作更多高质量内容
📗本文收录于 mysql 专栏,有需要者,可直接订阅专栏实时获取更新
📘高质量专栏 云原生、RabbitMQ、Spring全家桶 等仍在更新,欢迎指导
📙Zookeeper Redis dubbo docker netty等诸多框架,以及架构与分布式专题即将上线,敬请期待
一、MySQL的锁指什么
我们先来看一下Mysql的基本构成,如下图,以前我们其实也介绍过,MySQL数据库总体分为三个部分:
- Server层:负责处理客户端连接、查询解析和优化、数据访问控制、事务处理、日志、replication和其他管理操作。
- 存储引擎:负责数据的存储和检索等操作。MySQL支持多个存储引擎,如InnoDB、MyISAM、MEMORY等。
- 物理磁盘层:真正存储数据的位置,保存着数据库数据以及各类日志。
我们日常说的MySQL的各种锁,有的是由存储引擎提供的(如行锁),有些锁是有Server层提供的(如全局锁、表锁),它们结合起来才形成了完整的锁的体系
二、排他与共享
锁从不同角度理解,其实会有不同的分类,也就是说同一个东西,在不同的分类下叫不同的锁,但其实它们并不冲突。在讨论 MySQL 的锁时,一般我们会有这样两种分类:
- 锁的粒度
- 是否排他
从锁的粒度来看,可以分为全局锁
、表锁
和行锁
,顾名思义,锁的层级分别是数据库、某张表、以及表里的行。
从是否独占来看,可以分为排它锁
、共享锁
在innoDB,对于同一个资源,是允许设定 排它锁(X) 和 共享锁(S) 两种的,它们的兼容关系如下:
X | S | |
---|---|---|
X | 冲突 | 冲突 |
S | 冲突 | 兼容 |
比如事务A对某一行上了共享锁(S),此时再来一个事务B,如果B需要这个资源的共享锁,那么它能立即获得。如果B需要该资源的排它锁,事务B就需要等待了。
而不同粒度的锁,接下来我们以一一讲解
三、全局锁(Global Lock)
用于 限制整个数据库实例 的访问,当执行一些需要全局一致性的操作时,例如备份、恢复等,可以使用全局锁,如下命令
FLUSH TABLES WITH READ LOCK
这个命令会对所有数据库的所有表都上一个读锁,加完这个锁后,所有的表都会被锁定从而无法插入任何内容了(mysql自己的系统日志表不在此列)
四、表锁(Table Lock)
锁定整个表,在执行涉及整个表的操作时,会对整个表进行锁定,避免其他事务对该表进行并发操作。它的上锁及解锁语法如下
-- 加锁
LOCK {TABLE | TABLES}tbl_name [[AS] alias] lock_type[, tbl_name [[AS] alias] lock_type] ...
lock_type: {READ [LOCAL]| WRITE
}-- 释放锁
UNLOCK {TABLE | TABLES}
一般情况下,不建议使用这种表锁,除非是对一组MyISAM的表来操作,那么提前将它们锁定会提高效率
五、意向锁(Intention Locks)
InnoDB 支持多粒度锁,允许行锁和表锁共存。例如下面的语句就可以在指定的表上使用排他锁(X锁):
LOCK TABLES … WRITE
而为了同时避免遍历行锁的困境:比如事务A获取了某一行的排它锁,此时事务B想锁表,就必须遍历每一行检查是否有锁;同时也为了避免不同粒度间的锁出现死锁,所以InnoDB使用了意向锁。意向锁是表级别的锁,它指示事务以后对表中的某一行需要哪种类型的锁(共享的还是排他的)。有两种类型的意向锁:
- 意向共享锁(IS)表明事务打算对表中的单个行设置共享锁。
- 意向排他锁(IX)表示事务打算对表中的单个行设置排他锁。
例如,SELECT…FOR SHARE 设置IS锁,SELECT…FOR UPDATE 设置一个IX锁。
在事务获得表中某一行的共享锁之前,它必须首先获得表上的IS锁或更强的锁。
在事务获得表中某一行的排他锁之前,它必须首先获得该表上的IX锁
表级锁类型兼容性如下表所示:
X | IX | S | IS | |
---|---|---|---|---|
X | 冲突 | 冲突 | 冲突 | 冲突 |
IX | 冲突 | 兼容 | 冲突 | 兼容 |
S | 冲突 | 冲突 | 兼容 | 兼容 |
IS | 冲突 | 兼容 | 兼容 | 兼容 |
这个表的理解其实很简单:
(1)X 作为表的排他锁,和其他所有表锁冲突
(2)IX 代表准备修改某一行,此时如果有人持有表,不论是 X 还是 S,为了防止冲突或不一致,所以会返回冲突
如果锁与现有锁兼容,则将锁授予请求事务,但如果它与现有锁冲突,则不会授予。事务等待,直到冲突的现有锁被释放。如果锁请求与现有锁冲突,并且由于会导致死锁而无法授予,则会发生错误。
意向锁的主要目的是显示某人正在锁定表中的一行,或者将要锁定表中的一行,作为行锁前置的隐式锁。也就是说若你仅使用表锁,或仅使用行锁,意向锁是不会让你阻塞的。只有你在持有行锁的情况下又使用表锁,它才能发挥它的用处
六、行级锁(Row Lock)
在InnoDB存储引擎中,默认使用的是行级锁。它可以实现更细粒度的并发控制,只锁定部分行,而不是整个表,提高了并发性能。而从实际表现来说,其又分为三种 记录锁(Record Locks)
、间隙锁(Gap Locks)
,以及所谓临键锁(Next-Key Locks)
。实际上在源码种,这三种锁其实叫 LOCK_REC_NOT_GAP、LOCK_GAP、LOCK_ORDINARY
/* Precise modes /
/* this flag denotes an ordinary next-key lock in contrast to LOCK_GAP or
LOCK_REC_NOT_GAP /
constexpr uint32_t LOCK_ORDINARY = 0;
/* when this bit is set, it means that the lock holds only on the gap before
the record; for instance, an x-lock on the gap does not give permission to
modify the record on which the bit is set; locks of this type are created
when records are removed from the index chain of records /
constexpr uint32_t LOCK_GAP = 512;
/* this bit means that the lock is only on the index record and does NOT
block inserts to the gap before the index record; this is used in the case
when we retrieve a record with a unique key, and is also used in locking
plain SELECTs (not part of UPDATE or DELETE) when the user has set the READ
COMMITTED isolation level */
constexpr uint32_t LOCK_REC_NOT_GAP = 1024;
1. 记录锁(Record Locks)
记录锁是索引记录上的锁,例如,
SELECT c1 FROM t WHERE c1=10 For update;
这样就能阻止任何其他事务插入、更新或删除c1是10为的行。
记录锁总是锁定索引,即使定义的表没有索引也是如此。对于这样的情况,InnoDB创建一个隐藏的聚集索引,并使用该索引进行记录锁定
2. 间隙锁(Gap Locks)
如果我们把隔离级别设定为可重复度(RR),MySQL就会为我们解决”幻读“现象,这里面除了MVCC的作用外,还会在此时引入”间隙锁“的概念,间隙锁本质上是 在索引记录之间的间隙上的锁,或者在第一个索引记录之前或最后一个索引记录之后的间隙上的锁。比如说当我们执行这样一个SQL时
SELECT c1 FROM t WHERE c1 BETWEEN 10 and 20 For Update
就会防止其他事务将值15插入到列t.c1中,因为范围中所有现有值之间的间隙被锁定。
3. 临键锁(Next-Key Locks)
next-key锁是索引记录上的记录锁和索引记录之前的间隙上的间隙锁的组合。InnoDB执行行级锁的方式是,当它搜索或扫描一个表索引时,它会在遇到的索引记录上设置共享锁或排他锁。因此,行级锁实际上是索引记录锁。索引记录上的next-key锁也会影响该索引记录之前的“间隙”。也就是说,next-key锁是索引记录锁加上索引记录前面的间隙锁。
假设索引包含值10、11、13和20。此索引的Next-Key Locks锁定则覆盖以下区间,其中圆括号表示不包含区间端点,方括号表示包含端点:
(negative infinity, 10]
(10, 11]
(11, 13]
(13, 20]
(20, positive infinity)
对于最后一个间隔,next-key锁锁定索引中最大值以上的间隙,以及值高于索引中任何实际值的“supremum”伪记录。”supremum“不是一个真正的索引记录,因此,实际上,这个next-key锁只锁定最大索引值后面的间隙。默认情况下,InnoDB运行在REPEATABLE READ事务隔离级别。在这种情况下,InnoDB使用next-key锁进行搜索和索引扫描,这可以防止幻行。
4. 插入意向锁(Insert Intention Locks)
学习了上面的间隙锁,我们不难知晓,想要插入新数据通常需要先获得间隙锁(隔离级别为可重复读及以上)。按照常理来说,如果有多个事务都想往一个间隙里插入数据,它们只要慢慢排队就好了,但是,我们还需要意识到,一旦事务A插入一条数据成功,原先的间隙可能就会变成两个间隙,事务B可能又被A新诞生的这个间隙所阻碍。为了优化这种插入排队的情况,innodb提出了插入意向锁
的概念:
An insert intention lock is a type of gap lock set by INSERT operations prior to row insertion. This lock
signals the intent to insert in such a way that multiple transactions inserting into the same index gap
need not wait for each other if they are not inserting at the same position within the gap插入意图锁是insert操作在行插入之前设置的一种间隙锁。这个锁以这样一种方式表示插入的意图,即插入到相同索引间隙中的多个事务如果不在间隙内的相同位置插入,则不需要彼此等待
也就是说,插入操作在获取间隙锁之前,会先获取到插入意向锁,下面的示例演示了一个事务在获得插入记录的排他锁之前使用插入意图锁。该示例涉及两个客户机A和b。客户机A创建一个包含两个索引记录(90和102)的表,然后启动一个事务,对ID大于100的索引记录设置排他锁。排他锁包括记录102之前的间隙锁:
mysql> CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
mysql> INSERT INTO child (id) values (90),(102);mysql> START TRANSACTION;
mysql> SELECT * FROM child WHERE id > 100 FOR UPDATE;
+-----+
| id |
+-----+
| 102 |
+-----+
客户端B开始一个事务,向缺口间隙插入一条记录,事务在等待获得排他锁时接受插入意图锁:
mysql> START TRANSACTION;
mysql> INSERT INTO child (id) VALUES (101);
在SHOW ENGINE INNODB STATUS和INNODB monitor输出中,插入意图锁的事务数据如下所示:
RECORD LOCKS space id 31 page no 3 n bits 72 index `PRIMARY` of table `test`.`child`
trx id 8731 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 3 PHYSICAL RECORD: n_fields 3; compact format; info bits 00: len 4; hex 80000066; asc f;;1: len 6; hex 000000002215; asc " ;;2: len 7; hex 9000000172011c; asc r ;;...
5. 行锁总结
其实对于行锁,现在解析的文章有很多,我们后续也可能结合源码进行更深入的解释。但在这里我们可以先进行总结(源于Mysql源码版本8.0.30)
- 锁基于扫描到的索引,对于innoDB,哪怕你没有显示建立索引,每一张表也都至少会有一个索引(即其聚集索引)
- 间隙锁(Gap Locks) 只有在隔离级别为
可重复读
以上才会有 - 隔离级别为
读未提交
/读提交
时,行级锁默认使用记录锁(Record Locks),隔离级别为可重复读
/序列化
时,行级锁默认使用的是临键锁(Next-Key Locks) - 间隙锁(Gap Locks) 的目的是不让这段间隙内插入新的数据,因此其设计与传统意义上的
共享
/排他
概念不一样。比如:事务A在一个间隙上持有共享间隙锁(间隙s锁),而事务B可以在同一个间隙上持有排他性间隙锁(间隙x锁)
七、自增锁(AUTO-INC Locks)
AUTO-INC锁是一种特殊的表级锁
,用于在具有AUTO_INCREMENT列的表中插入事务。
在最简单的情况下,如果一个事务正在向表中插入值,那么任何其他事务都必须等待对该表进行自己的插入,以便第一个事务插入的行接收连续的主键值。innodb_autoinc_lock_mode变量控制用于自动增量锁定的算法。它允许您选择如何在可预测的自动递增值序列和插入操作的最大并发性之间进行权衡。
这里有 0、1、2 三种模式可选
-
0(traditional):这是最常用的模式。在这种模式下,InnoDB使用一个全局的互斥锁(AUTO-INC锁)来保护自增主键的访问。当有一个事务插入新记录时,其他事务必须等待该事务释放AUTO-INC锁后才能插入新记录,该锁通常保持到语句结束(而不是事务结束)。
-
1(consecutive):在这种模式下,InnoDB使用一个递增的互斥锁(AUTO-INC锁)来保护自增主键的访问。如果我们可以预知插入的数据条数,InnoDB会为每个事务分配一个独立的自增值区间。当一个事务需要插入自增值时,它就可以在自己的区间内找到一个可用的自增值,然后将其插入到表中。通过为每个事务分配独立的自增值区间,Consecutive模式可以实现并行插入,这种模式适用于具有高并发读写的应用,可以提高性能。
-
2(interleaved):这种模式是在MySQL 8.0中引入的新模式。在这种模式下,事务们都不再持有表级AUTO-INC锁,该模式可以支持多个语句可以同时生成数字,也就是说,数字的分配在多个语句之间交错进行。
需要注意的是,在我们使用它不同种类的插入语句的时候,consecutive 自增锁有可能还是会使用全局互斥锁的样子,因为不是每一种 insert 都能提前预知其数量的,比如下面这样的插入:
INSERT INTO t1 (c2) SELECT ... from another table ...
相关文章:

拒绝零散碎片, 一文理清MySQL的各种锁
系列文章目录 学习MySQL先有全局观,细说其发展历程及特点 Mysql常用操作,谈谈排序与分页 拒绝零散碎片, 一文理清MySQL的各种锁(收藏向) 系列文章目录一、MySQL的锁指什么二、排他与共享三、全局锁(Global…...

P5711 【深基3.例3】闰年判断
1. 题目链接 https://www.luogu.com.cn/problem/P5711 P5711 【深基3.例3】闰年判断 2. 题目描述 题目描述:判断一个数是否是闰年 输入:输入一个整数n 输出:输出1或0,如果是闰年,输出1,否则输出0 3. 我的…...

基于Raft算法实现的分布式键值对存储系统——学习笔记
目录 1 基于Raft算法实现的分布式键值对存储系统 1.1 模块 2 Raft 算法 2 .1 概念 2.2 raft角色(先简单了解,方便后续阅读) 2.3 raft想解决什么问题? 2.4 选举领导 2.5 领导者故障 附录: 参考文献࿱…...

秋招突击——6/17——复习{整理昨天的面试资料}——新作{删除链表倒数第n个节点}
文章目录 引言复习新作删除链表倒数第N个节点题目描述个人实现参考实现 总结 引言 主管面,面的很凄惨,不过无所谓了,我已经尽力了。上午都在整理的面经,没有复习算法,而且这两天要弄一下论文,二十号就要提…...

宝塔面板使用技巧(pure-FTP)上传文件和文件夹默认权限644的修改
前言 科技在进步各种各样的开源软件和库让我们应接不暇,我估计现在所有做php开发的人员都知道宝塔面板,我就经常用,但是不知道大家出现过一个问题不就是在我们开发过程中需要实时的给服务器上传我们开发的文件那么就涉及到了宝塔自带的pure-F…...

mac m芯片安装win11遇坑
mac m芯片安装win11遇坑 1、下载arm架构镜像 磁力链接: magnet:?xturn:btih:e8c15208116083660709eac9aee124e025c01447&dnSW_DVD9_Win_Pro_11_22H2_64ARM_ChnSimp_Pro_Ent_EDU_N_MLF_X23-12755.ISO&xl57198960642、使用VMWare Fusion安装,启…...

一个自定义流程的平台
脚本语言使用的是C#,当用户发布一个新的流程时,会把C#的脚本编译成dll,然后添加到微服务中,因为有了硬编译,所以执行速度是非常快的。逻辑脚本支持调试,可以断点和逐行调试。平台提供了调试工具,…...

舔狗日记Puls微信小程序源码
源码介绍: 这是一款舔狗日记Puls微信小程序源码,提供每日一舔的功能,让你舔到最后,什么都有! 源码通过API获取一些舔狗日记,内置了100多句舔狗日记,让你摆脱上班摸鱼的无聊时光, …...

PyMuPDF 操作手册 - 05 PDF的OCR识别等
文章目录 六、PyMuPDF的OCR识别6.1 使用 Tesseract进行OCR6.2 使用MuPDF进行OCR6.3 使用 Python 包easyocr进行OCR识别6.4 使用 Python ocrmypdf包进行OCR识别6.5 将图像批量OCR并转换为PDF七、PDF附加、嵌入、批注等7.1 附加文件7.2 嵌入文件7.3 从文档中获取所有批注六、PyMu…...

Vue与TypeScript的配合:如何在Vue项目中使用TypeScript,利用静态类型提高代码的可维护性
环境搭建: 在你的 Vue 项目中使用 TypeScript,使你的代码具有静态类型检查、IDE 的类型提示等有益的功能。以下是搭建 Vue 和 TypeScript 的开发环境的步骤: 创建一个项目 使用 Vue CLI 创建一个新的Vue项目是最简单的方法: vue create my-project 在出现的提示中,选择…...

华为仓颉语言介绍
文章目录 1.简介2.初识仓颉语言3.基本概念3.1标识符3.2程序结构3.3变量3.4表达式3.4.1if 表达式3.4.2while语句3.4.3do-while表达式3.4.4 for-in 表达式3.4.5 where条件3.4.6 break和continue 3.5 函数 1.简介 随着万物互联以及智能时代的到来,软件的形态将发生巨大…...

《昇思 25 天学习打卡营第 3 天 | 张量 Tensor 》
《昇思 25 天学习打卡营第 3 天 | 张量 Tensor 》 活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp 签名:Sam9029 感觉像是在 学习高数一样 张量 Tensor 张量是一种特殊的数据结构,与数组和矩阵非常相似。 张量…...

free命令——显示系统内存使用情况
free命令的功能是显示系统内存使用情况,包含物理内存和交换内存的总量、使用量和空闲量。 语法格式:free [选项] 常用选项及含义 选项含义-b以字节B为单位显示内存和交换内存的容量使用情况-k以KB为单位显示内存和交换内存的容量使用情况-m以MB为单位…...

麒麟移动运行环境(KMRE)——国内首个开源的商用移固融合“Android生态兼容环境”正式开源
近日,由麒麟软件研发的KMRE(Kylin Mobile Runtime Environment,麒麟移动运行环境)在openKylin(开放麒麟)社区正式发布,为Linux桌面操作系统产品提供了高效的Android运行环境解决方案。这也是国内…...

print(“{}{}“.format())
print("{}{}".format()) 是 Python 中用于格式化字符串并将其输出到控制台的一种方法。format 方法允许你在字符串中插入变量或表达式的值,并以指定的格式显示它们。 基本语法 print("format_string".format(value1, value2, ...))format_str…...

2-12 基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪
基于CV模型卡尔曼滤波、CT模型卡尔曼滤波、IMM模型滤波的目标跟踪。输出跟踪轨迹及其误差。程序已调通,可直接运行。 2-12 CV模型卡尔曼滤波 CT模型卡尔曼滤波 - 小红书 (xiaohongshu.com)...

序列1bp插入有什么影响
1bp插入突变(1个碱基插入)在基因序列中通常会引起以下几种影响: 移码突变(Frameshift Mutation): 插入的一个碱基会改变插入点之后所有的密码子,导致读取框的移动。这种变化通常会引起整个蛋白质…...

CVPR 2024盛况空前,上海科技大学夺得最佳学生论文奖,惊艳全场
CVPR 2024盛况空前!上海科技大学夺得最佳学生论文奖,惊艳全场! 会议之眼 快讯 2024 年 CVPR (Computer Vision and Pattern Recogntion Conference) 即国际计算机视觉与模式识别会议,于6月17日至21日正在美国西雅图召…...

HTTP 状态码详解及使用场景
目录 1xx 信息性状态码2xx 成功状态码3xx 重定向状态码4xx 客户端错误状态码5xx 服务器错误状态码 HTTP思维导图连接:https://note.youdao.com/s/A7QHimm0 1xx 信息性状态码 100 Continue:表示客户端应继续发送请求的其余部分。 使用场景:客…...

【Windows】配置Flutter开发环境
一、下载 flutter sdk 点此跳至下载官网 下载好flutter sdk,并解压到自定义的位置。 二、配置环境变量 此电脑 --> 右键 选择 属性 --> 点击 高级系统设置 --> 会弹出系统属性的窗口,点击 环境变量 按钮 1.配置加速镜像地址 PUB_HOSTED_…...

云渲染与传统渲染器的较量与融合
随着云计算技术的突破性进展,云渲染技术应运而生,为传统渲染器带来了前所未有的挑战与机遇。云渲染,以其在计算资源、可扩展性、协作便利性等方面的显著优势,正在重新定义渲染行业的标准。云渲染与传统渲染器之间的核心差异&#…...

比较新旧两数组列表,新增或删除数据库记录(ai生成)
两数组比较 元素相同则不处理,缺少则删除数据库记录,多余则新增数据库记录。 为了解决这个问题,我们需要定义两个数组array1和array2,它们包含数据库中的记录。然后,我们可以遍历这两个数组,并对数据库执行相应的操作。以下是一个…...

Java基础 - 练习(五)根据今天日期获取一周内的日期(基姆拉尔森公式)
基姆拉尔森计算公式用于计算一周内的日期。比如给你年月日,从而计算今天是星期几。 基姆拉尔森公式 Week (d2*m3*(m1)/5yy/4-y/100y/4001) mod 7, 3<m<14Week的取值范围是0 ~ 6,其中0代表星期日,1 ~ 6分别代表星期一到星期…...

HTML5 新元素
HTML5 新元素 HTML5是最新版本的HTML,引入了许多新元素和功能,以更好地满足现代网页设计的需要。这些新元素不仅增强了网页的表现力,还提高了代码的可读性和可维护性。本文将详细介绍HTML5中的新元素,包括它们的功能和用法。 1.…...

虹软ArcSoft—真正离线免费的人脸识别SDK
虹软ArcSoft—真正离线免费的人脸识别SDK 高级功能收费 还是很好滴 人证核验功能是C/C的SDK,需要封装为C#,然后暴露为Restful API使用...

[环境配置]vscode通过ssh连接autodl进行项目开发
警告:如果使用VSCode直接执行或开终端执行训练程序,请在调试完成后最后通过screen/tmux工具开守护进程,确保程序不受SSH连接中断影响程序执行! 官方文档:请戳 AutoDL使用方法: 在进行操作前您需要提前安装…...

2024中国宁波-东南亚职业教育产教协同发展校企对接会举办
2024年6月16日,由东南亚教育部长组织技术教育发展中心(SEAMEO TED)、联合国教科文组织国际农村教育研究与培训中心(UNESCO INRULED)、中国教育国际交流协会(CEAIE)三方主办的“2024中国宁波-东南…...

Web前端、后端与建站:全方位解析四大基石、五大挑战、六大技术与七大策略
Web前端、后端与建站:全方位解析四大基石、五大挑战、六大技术与七大策略 在当今数字化时代,Web前端、后端以及建站技术已经成为构建现代网站和应用不可或缺的关键要素。本文将从四个方面探讨Web前端与后端的基础,从五个方面分析建站过程中的…...

nginx出现504 Gateway Time-out错误的原因分析及解决
nginx出现504 Gateway Time-out错误的原因分析及解决 1、查看公网带宽是否被打满 2、查看网络是否有波动(可以在nginx上ping后端服务,看是否有丢包情况) 3、查看服务器资源使用情况(cpu、内存、磁盘、网络等) 4、查看nginx日志,具体到哪个服务的哪个…...

基于STM32的智能插座项目
本项目基于stm32f103c8t6芯片通过集成众多模块和元器件,通过ESP01-S和阿里云平台实现智能插座的项目开展。资料获取到咸🐟:xy591215295250 \\\或者联系wechat 号:comprehensivable 随着电子科学与技术的快速发展,软硬件…...