当前位置: 首页 > news >正文

MySQL是怎么加锁的

1. 全局锁

1.1 什么是全局锁?

全局锁是一种一次性锁住整个数据库的锁定机制。一旦加上全局锁,整个数据库的所有表都会处于只读状态,这意味着所有修改操作(如INSERTUPDATEDELETE)都会被阻塞。

常用的SQL命令:

  • FLUSH TABLES WITH READ LOCK (FTWRL)
    • 这个命令会加全局读锁,让所有表进入只读模式。
    • 常用于做全库备份(逻辑备份)。

全局锁的特点:

  • 影响范围大: 影响整个库,所有写入操作都会阻塞,甚至影响分布式事务协调。
  • 性能开销高: 加锁期间可能导致服务变慢或挂起。
  • 非必要时少用: 通常只用于短时间操作,比如一致性快照备份。

1.2 全局锁与行级锁的区别

特性全局锁行级锁
作用范围整个数据库单条或多条记录
加锁代价
并发影响严重,所有写入被阻塞较小,影响特定记录
适用场景数据库备份常规事务处理

2. 行级锁

2.1 行级锁的概念

        行级锁是 MySQL 中最细粒度的锁机制之一,只锁定与操作相关的行,不会影响其他行。它能够显著提升并发性能,是事务中最常见的锁定方式。

2.2 什么操作会加行级锁?

以下三类操作通常会触发行级锁:

  1. 锁定读(Select with Lock)

    • SQL 示例:
      SELECT * FROM table_name WHERE condition FOR UPDATE;-- 加独占锁 
      SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE; 
      -- 加共享锁
    • 作用:
      • FOR UPDATE:加独占锁,其他事务无法修改此行,适用于需要更新的场景。
      • LOCK IN SHARE MODE:加共享锁,允许其他事务只读,但禁止修改,适用于仅验证或读取数据的场景。
  2. UPDATEDELETE 操作

    • 这些操作会自动对涉及的行加独占锁,防止其他事务对相同行进行操作。
    • 例如:
      UPDATE table_name SET col = value WHERE condition; 
      DELETE FROM table_name WHERE condition;
  3. 插入冲突时的加锁

    • 如果两个事务尝试插入相同的唯一索引值,MySQL 会对相关记录加锁以避免冲突。

2.3 共享锁与独占锁

  1. 共享锁 (Shared Lock, S锁)

    • 允许多个事务同时读取相同行的数据,但不允许修改。
    • 示例:
      SELECT * FROM table_name WHERE condition LOCK IN SHARE MODE;
  2. 独占锁 (Exclusive Lock, X锁)

    • 阻止其他事务对相同行进行读取和修改。
    • 示例:
      SELECT * FROM table_name WHERE condition FOR UPDATE; 
      UPDATE table_name SET col = value WHERE condition;

共享锁与独占锁的冲突矩阵:

当前锁类型新锁类型是否允许加锁
无锁共享锁
无锁独占锁
共享锁共享锁
共享锁独占锁
独占锁共享锁
独占锁独占锁

2.4 行级锁的种类

  1. Record Lock

    • 锁定索引记录本身(行记录)。
    • 示例:如果索引值为 5 的记录被锁住,只有这条记录会受到影响。
  2. Gap Lock

    • 锁定索引范围之间的“间隙”,防止在间隙中插入新记录。
    • 示例:在范围 (1, 5) 之间加锁,其他事务不能在该范围内插入新记录。
  3. Next-Key Lock

    • 是 Record Lock 和 Gap Lock 的组合,锁定当前索引记录和紧邻的间隙。
    • 示例:如果锁定索引值 5,则范围 (4, 5](5, 6) 都会被锁住。

3. MySQL 是如何加行级锁的?

3.1 唯一索引等值查询

        唯一索引等值查询是 MySQL 中行级锁加锁的重要场景之一。MySQL 会根据查询条件和记录是否存在选择不同的加锁策略。

3.1.1 查询记录存在时的加锁情况

  • 加锁行为:
    唯一索引等值查询(如 SELECT * FROM table_name WHERE id = 5 FOR UPDATE),如果记录存在,MySQL 会对该记录加 Next-Key Lock
    但是,由于查询条件是等值查询,且记录存在,锁会退化为 Record Lock,仅锁住当前记录,不涉及间隙部分。

  • 原因: Next-Key Lock 是 MySQL 默认的加锁机制,用于避免幻读(Phantom Read)。但等值查询记录已存在时,不会产生幻读,因此只需锁住记录本身即可,锁退化为 Record Lock。

  • 命令分析: 使用命令 SHOW ENGINE INNODB STATUS 查看当前锁的信息:

    SELECT * FROM table_name WHERE id = 5 FOR UPDATE; 
    -- 查看加锁情况 
    SHOW ENGINE INNODB STATUS;

3.1.2 查询记录不存在时的加锁情况

  • 加锁行为: 唯一索引等值查询(如 SELECT * FROM table_name WHERE id = 5 FOR UPDATE),如果记录不存在,MySQL 会在索引树中找到第一条大于该查询记录的索引,并对该记录的索引加 Next-Key Lock,但此锁会退化为 Gap Lock

  • 原因:

    • 记录不存在时,为防止其他事务插入新的记录而破坏查询结果的唯一性,需要锁住目标记录对应的间隙。
    • 由于间隙锁不会锁住实际记录,插入 id = 5 的操作会被阻止。
  • 间隙范围的确定:

    • 假设索引为 (1, 3, 7),查询 id = 5
      • 在索引树中,id = 7 是第一个大于 5 的记录。
      • MySQL 会锁住间隙 (3, 7)

3.2 间隙锁的范围

  • 间隙锁的定义: 间隙锁(Gap Lock)锁住的是索引区间,而不是实际的记录。

  • 间隙范围确定规则:

    • 在索引 (1, 3, 7) 中:
      • 查询 id = 4 会锁住 (3, 7)
      • 查询 id = 8 会锁住 (7, ∞)
  • 重要提示: 如果目标索引在索引树中是最后一条记录,那么间隙范围会包括正无穷。例如,查询 id > 7 会锁住 (7, ∞)

3.3 唯一索引范围查询

实验一:针对「大于」的范围查询

  • 场景: 查询 id > 3 的记录。假设索引为 (1, 3, 5, 7)
  • 加锁行为:
    • 查询会锁住 (3, 5)(5, 7) 的所有范围(Next-Key Lock)。
    • 如果记录 id = 3 存在,该索引不会退化为 Record Lock,因为这是范围查询。

实验二:针对「大于等于」的范围查询

  • 场景: 查询 id >= 3 的记录。
  • 加锁行为:
    • 锁住 (3, 5),同时对 id = 3 的记录加 Record Lock。
    • 如果 id = 3 存在,它会被单独锁住,保证范围内的一致性。

3.4 非唯一索引查询

非唯一索引等值查询:记录不存在时

  • 场景: 查询 age = 22 时,索引中只有 (20, 25)
  • 加锁行为:
    • MySQL 会锁住 (20, 25) 的间隙,阻止在该范围内插入 age = 22 的记录。

阻塞和非阻塞的规则:

  • 非阻塞:
    如果插入的记录刚好是间隙锁边界(如 age = 20age = 25),不会被阻塞。
  • 阻塞:
    如果插入的记录在间隙内部(如 age = 22),会被阻塞。

3.5 唯一索引范围查询的实验分析

针对「小于或者小于等于」的范围查询

实验一:针对「小于」的范围查询,且查询条件值不存在表中

  • 场景:
    查询条件 id < 5,假设索引为 (1, 3, 7)
  • 加锁行为:
    • 在索引树中,MySQL 会找到第一条大于查询条件的记录,即 id = 7
    • 锁定范围 (1, 3](3, 7)
    • 因为目标记录 id = 5 不存在,间隙锁 (3, 7) 防止其他事务插入 id = 5

实验二:针对「小于等于」的范围查询,且查询条件值存在表中

  • 场景:
    查询条件 id <= 3,假设索引为 (1, 3, 7)
  • 加锁行为:
    • MySQL 会锁住 (1, 3] 的间隙,同时对 id = 3 的记录加 Record Lock
    • 结果:
      • (1, 3] 是 Next-Key Lock,保护间隙。
      • id = 3 是 Record Lock,保护查询结果的记录。

实验三:针对「小于」的范围查询,且查询条件值存在表中

  • 场景:
    查询条件 id < 3,假设索引为 (1, 3, 7)
  • 加锁行为:
    • MySQL 会锁住 (1, 3) 的间隙,但不会锁定 id = 3 的记录本身。
    • 因为 id < 3 的范围查询,不包括 id = 3

3.6 非唯一索引查询的实验分析

实验一:针对非唯一索引等值查询时,查询的值不存在的情况

  • 场景:
    查询条件为 age = 22,假设非唯一索引为 (20, 25),事务 A 持有间隙锁 (20, 25)

  • 加锁行为:

    • 事务 A 加锁 (20, 25),阻止任何在该间隙内插入 age = 22 的记录。
  • 插入操作规则:

    • 允许插入边界值:
      • 插入 age = 20age = 25 时,成功。
    • 阻止插入间隙值:
      • 插入 age = 22age = 23 时,被阻塞。

实验二:针对非唯一索引等值查询时,查询的值存在的情况

  • 场景:
    查询条件为 age = 22,假设非唯一索引为 (20, 22, 25)

  • 加锁行为:

    • 查询会在 (20, 22)(22, 25) 的间隙加锁,防止其他事务插入相同范围内的记录。
  • 特殊点:

    • 与唯一索引不同,非唯一索引不会将等值查询的 Next-Key Lock 退化为 Record Lock。原因是非唯一索引可能有多个匹配结果,Next-Key Lock 必须锁住完整范围以防止幻读。

3.7 非唯一索引范围查询

实验:针对 age >= 22 的范围查询

  • 场景:
    查询条件为 age >= 22,假设非唯一索引为 (20, 22, 25)
  • 加锁行为:
    • 查询会锁住 (22, 25) 的范围,同时对 age = 22 的记录加 Record Lock

为什么不会退化为记录锁?

  • 即使 age = 22 是等值匹配,非唯一索引需要锁定范围 (22, 25) 以避免新插入的记录(如 age = 23)破坏查询结果的一致性。

3.8 无索引的查询

当查询中未使用索引时,MySQL 默认会对整张表加锁。

  • 行为:
    • 如果事务操作未命中索引,MySQL 会锁住所有扫描过的记录。
  • 示例:
    SELECT * FROM table_name WHERE col = value FOR UPDATE;
    • col 未建立索引,查询将锁定全表,影响性能。

总结:
        通过上述分析,我们发现 MySQL 加锁行为会根据查询类型、索引种类、目标记录的存在与否发生变化。无论是唯一索引还是非唯一索引,MySQL 都会优先通过加锁保护数据的一致性,同时尽可能减少锁的粒度以提升并发性能。

4. 总结:MySQL 加锁机制核心要点

        通过上述内容分析,我们可以从以下几个方面总结 MySQL 加锁机制的特点和开发中的优化建议。

4.1 MySQL 加锁机制的核心逻辑

  1. 锁的层次与范围

    • 全局锁:
      影响整个数据库,适用于一致性快照备份,但会严重影响并发性能,非必要情况应避免使用。
    • 表级锁:
      影响单张表的所有记录,例如 LOCK TABLES。适用于临时阻止表的并发写操作。
    • 行级锁:
      影响特定记录或索引范围,包括 Record Lock、Gap Lock 和 Next-Key Lock,是事务中最常用的锁机制。
  2. 不同操作的加锁行为

    • 等值查询:
      • 唯一索引:查询结果存在时,Next-Key Lock 退化为 Record Lock;结果不存在时,退化为 Gap Lock。
      • 非唯一索引:Next-Key Lock 不会退化,始终锁定查询范围,防止幻读。
    • 范围查询:
      始终加 Next-Key Lock,锁住所有可能的间隙与记录,保证数据一致性。
    • 无索引查询:
      扫描所有记录并加锁,会影响整个表的性能,应避免。
  3. 幻读与加锁策略

    • Next-Key Lock 是为了解决幻读问题,确保事务的一致性和隔离性。
    • 间隙锁(Gap Lock)用于阻止在索引范围内插入新记录,从而避免影响查询结果。

4.2 开发中的优化建议

  1. 选择合适的事务隔离级别

    • 在性能与一致性之间寻找平衡:
      • 如果业务对一致性要求高,使用 REPEATABLE READ
      • 如果性能优先,可以考虑 READ COMMITTED,避免间隙锁的开销。
  2. 使用索引优化锁的范围

    • 优化查询语句,尽量使用索引覆盖查询,减少扫描范围。
    • 避免无索引查询导致全表锁。
  3. 合理设计索引结构

    • 唯一索引更适合需要高并发的场景,因为其加锁范围较小。
    • 对需要范围查询的字段,设计合适的联合索引,减少锁的粒度。
  4. 避免长时间持锁

    • 在事务中,尽量减少锁的持有时间:
      • 在事务中后置查询操作,优先完成逻辑处理。
      • 确保事务代码逻辑简洁高效。
  5. 利用分析工具检查锁状态

    • 使用 SHOW ENGINE INNODB STATUS 或性能分析工具,检查当前加锁情况,及时优化。

4.3 真实场景示例

  1. 防止插入冲突的案例

    • 场景:
      一个电商库存系统,需要查询商品库存并更新记录。
    • 问题:
      在查询和更新库存之间,可能有其他事务插入新的库存记录,导致幻读。
    • 解决方案:
      使用 FOR UPDATE 加独占锁,锁住目标记录,避免其他事务的修改。
  2. 避免死锁的案例

    • 场景:
      两个事务同时更新用户余额和订单状态。
    • 问题:
      锁的获取顺序不一致导致死锁。
    • 解决方案:
      • 明确加锁顺序,避免循环依赖。
      • 使用较短事务,快速释放锁。

4.4 核心理解与优化思路

  1. 锁的本质:
    锁是为了在高并发场景下,保障数据的一致性与隔离性,而设计的一种协调机制。

  2. 性能与一致性的平衡:

    • MySQL 提供多种锁机制,让我们根据业务需求灵活选择锁的粒度与类型。
    • 对于高并发场景,尽量减少锁的范围和持有时间。
  3. 工具化分析:

    • 借助 SHOW ENGINE INNODB STATUS、慢查询日志等工具,监控锁的使用情况。
    • 通过索引优化、SQL 优化等手段减少锁冲突。

        MySQL 的加锁机制在不同场景下会有复杂的行为逻辑,但其设计目标始终是提升并发性能的同时,保证事务的 ACID 特性。在开发中,掌握加锁的原理和特点,可以帮助我们优化查询性能、提升系统稳定性。

相关文章:

MySQL是怎么加锁的

1. 全局锁 1.1 什么是全局锁&#xff1f; 全局锁是一种一次性锁住整个数据库的锁定机制。一旦加上全局锁&#xff0c;整个数据库的所有表都会处于只读状态&#xff0c;这意味着所有修改操作&#xff08;如INSERT、UPDATE、DELETE&#xff09;都会被阻塞。 常用的SQL命令&…...

burp suite 5

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…...

硬件和自驾功能

1 硬件 指令集架构 (ISA)&#xff1a; ARM v6, v7, v8&#xff1a;这些是 ARM 公司设计的不同版本的指令集架构 (ISA)。ARM v6 和 v7 属于 32 位架构&#xff0c;而 ARM v8 则引入了 64 位支持&#xff08;即 ARMv8-A&#xff09;和 32 位向后兼容模式。需要强调的是&#xff…...

uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法 前言 在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现&#xff0c;因为官方有很多相关的功能和方法…...

车联网安全学习之TBOX

Telematics BOX&#xff0c;简称 T-BOX&#xff0c;也称远程信息处理控制单元&#xff08;Telematics Control Unit, TCU&#xff09;&#xff0c;集成GPS、外部通信接口、电子处理单元、微控制器、移动通信单元和存储器等功能模块。 TBOX 提供的功能有网络接入、OTA、远程控制…...

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货&#xff0c;复制粘贴即可&#xff01; # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…...

tomcat 运行加载机制解析

tomcat 运行加载机制 从tomcat jar包的加载顺序&#xff1a; tomcat的具体运行加载 可以从 start、setclasspath、catalina文件中看出来&#xff1a; start.bat执行 去找bin目录下的catalina.bat,catalina 或去找 bin\setenv.bat以获取标准环境变量&#xff0c;然后去找bin\…...

基于JWT跨语言开发分布式业务系统的挑战与实践:多语言协作的最佳方案

在现代分布式架构下&#xff0c;开发团队往往由来自不同技术栈和开发语言的工程师组成。如何有效地管理这些开发人员的协作&#xff0c;尤其是在实现跨语言的认证与授权机制时&#xff0c;成为了开发者面临的一个重大挑战。JSON Web Token&#xff08;JWT&#xff09;作为一种轻…...

Unity在运行状态下,当物体Mesh网格发生变化时,如何让MeshCollider碰撞体也随之实时同步变化?

旧版源代码地址&#xff1a;https://download.csdn.net/download/qq_41603955/90087225?spm1001.2014.3001.5501 旧版效果展示&#xff1a; 新版加上MeshCollider后的效果&#xff1a; 注意&#xff1a;在Unity中&#xff0c;当你动态地更改物体的Mesh时&#xff0c;通常期望…...

数组能排成的最小数

题目描述 输入一个正整数数组&#xff0c;把数组里所有整数拼接起来排成一个数&#xff0c;打印出能拼接出的所有数字中最小的一个。 例如输入数组{3&#xff0c;32&#xff0c;321}&#xff0c;则打印出这3个数字能排成的最小数字为321323 分析 3和32哪个数字排前面呢&…...

RNN模型介绍

RNN模型介绍 1.RNN模型介绍1.1什么是RNN模型1.2RNN模型作用1.3RNN模型分类 2.传统RNN模型2.1RNN结构图2.2RNN优缺点 3.LSTM模型3.1什么是LSTM模型3.2LSTM内部结构图3.3使用Pytorch构建LSTM模型3.4LSTM优缺点 4.GRU模型4.1什么是GRU模型4.2GRU内部图4.3使用Pytorch构建GRU模型4.…...

Maven最佳实践

Maven 是一种广泛使用的 Java 项目构建自动化工具。它简化了构建过程并帮助管理依赖关系&#xff0c;使开发人员的工作更轻松。Maven 详细介绍可以参考我写的这篇 Maven 核心概念总结 。 这篇文章不会涉及到 Maven 概念的介绍&#xff0c;主要讨论一些最佳实践、建议和技巧&am…...

Redis的高可用之哨兵模式

Redis哨兵主要是解决Redis主从同步时主数据库宕机问题,使其能够自动进行故障恢复&#xff0c;提高Redis系统的高可用性。 1. 哨兵的作用&#xff1a; 监控&#xff1a;哨兵通过心跳机制监控主库和从库的存活性。 选主&#xff1a;当主库宕机时&#xff0c;哨兵会选举出一个领…...

C# 设计模式--观察者模式 (Observer Pattern)

定义 观察者模式是一种行为设计模式&#xff0c;它定义了对象之间的一对多依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。观察者模式的核心在于解耦主题&#xff08;被观察者&#xff09;和观察者之间的依赖关系。 …...

如何使用Java编写Jmeter函数

Jmeter 自带有各种功能丰富的函数&#xff0c;可以帮助我们进行测试&#xff0c;但有时候提供的这些函数并不能满足我们的要求&#xff0c;这时候就需要我们自己来编写一个自定义的函数了。例如我们在测试时&#xff0c;有时候需要填入当前的时间&#xff0c;虽然我们可以使用p…...

Hive 窗口函数与分析函数深度解析:开启大数据分析的新维度

Hive 窗口函数与分析函数深度解析&#xff1a;开启大数据分析的新维度 在当今大数据蓬勃发展的时代&#xff0c;Hive 作为一款强大的数据仓库工具&#xff0c;其窗口函数和分析函数犹如一把把精巧的手术刀&#xff0c;助力数据分析师们精准地剖析海量数据&#xff0c;挖掘出深…...

Echart折线图属性设置 vue2

Echart折线图 官方配置项手册 Documentation - Apache ECharts 下面代码包含&#xff1a;设置标题、线条样式、图例圆圈的样式、显示名称格式、图片保存、增加Y轴目标值 updateChart(data) {const sortedData data.slice().sort((a, b) > new Date(a.deviceTime) - ne…...

蓝桥杯2117砍竹子(简单易懂 包看包会版)

问题描述 这天, 小明在砍竹子, 他面前有 n 棵竹子排成一排, 一开始第 i 棵竹子的 高度为 hi​. 他觉得一棵一棵砍太慢了, 决定使用魔法来砍竹子。魔法可以对连续的一 段相同高度的竹子使用, 假设这一段竹子的高度为 H, 那么 用一次魔法可以 把这一段竹子的高度都变为 ⌊H2⌋…...

华为 生产网解决方案,加速制造业数字化转型

华为推出新一代融合架构的生产网解决方案&#xff0c;加速制造业数字化转型-企业频道-东方网 智慧生产网解决方案-华为企业业务 华为面向制造行业升级生产网解决方案。全新一代融合架构&#xff0c;解决了生产数据的孤岛化、烟囱式、数据的价值无法发挥等问题&#xff0c;以促…...

原型模式(Prototype Pattern)——对象克隆、深克隆与浅克隆及适用场景

原型模式&#xff08;Prototype Pattern&#xff09;是设计模式中的一种创建型模式&#xff0c;目的是通过复制现有的对象来创建新的对象&#xff0c;而不是通过传统的实例化方式。原型模式常常用于需要创建大量类似对象的场景&#xff0c;可以提高性能并减少资源的消耗。下面将…...

基于Transformer架构的扩散模型

Scalable Diffusion Models with Transformers 本文介绍一篇发表于2023年国际计算机视觉大会&#xff08;ICCV&#xff09;的研究论文&#xff0c;该论文提出了一种基于Transformer架构的扩散模型&#xff0c;称为Diffusion Transformers (DiTs)。 通过用Transformer替代传统的…...

服务器上部署前端页面-实现IP+端口/index.html在线访问你的网页

首先一点&#xff0c;不管是那个框架开发的网页前端&#xff0c;最后都需要Build,构建完毕以后都是原始的HTML CSS JS 三样文件&#xff01; 所以不管用原始的三剑客&#xff08;HTML CSS JS&#xff09;开发的前端还是用各类框架开发的前端界面&#xff08;只是让开发简单…...

2024年华中杯数学建模B题使用行车轨迹估计交通信号灯周期问题解题全过程文档及程序

2024年华中杯数学建模 B题 使用行车轨迹估计交通信号灯周期问题 原题再现 某电子地图服务商希望获取城市路网中所有交通信号灯的红绿周期&#xff0c;以便为司机提供更好的导航服务。由于许多信号灯未接入网络&#xff0c;无法直接从交通管理部门获取所有信号灯的数据&#x…...

【C语言】SWP 文件:临时缓存文件

SWP 文件&#xff1a;临时缓存文件&#xff08;紧急保护机制&#xff09; 在 Linux 系统&#xff08;包括 Ubuntu&#xff09;中&#xff0c;SWP 文件是一种临时缓存文件&#xff0c;主要用于在编辑器&#xff08;如 Vim&#xff09;中紧急保护未保存的工作内容。当系统或编辑…...

【日常记录-Git】git switch

1. 简介 git switch是Git 2.23.0版本引入的一个新命令&#xff0c;用于切换分支和恢复工作树文件。其旨在提供一个更清晰、更直观的分支切换体验&#xff0c;以替代git checkout命令中用于分支切换的部分功能。 2. 常规操作 2.1 切换到已存在的分支 git switch <分支名>…...

Qt学习笔记第51到60讲

第51讲 记事本实现打开功能 回到第24个功能文件Notepad&#xff0c;给UI中的各个控件添加槽函数。 ①开始按钮 void Widget::on_btnOpen_clicked() {QString fileNameQFileDialog::getOpenFileName(this,tr("Open File"),"E:\\6_Qt Projects\\24_Notepad\\fi…...

灵途科技亮相2024世界传感器大会 分享光纤光源技术突破

12月1日至2日&#xff0c;2024世界传感器大会&#xff08;WSS&#xff09;在郑州国际会展中心隆重举办&#xff0c;泛自动驾驶领域光电感知专家灵途科技受邀参加“光纤传感器与激光雷达”分论坛&#xff0c;并在大会上带来《激光雷达用一体化光纤光源》专题演讲&#xff0c;同与…...

LeetCode刷题 -- 分治快排

目录 颜色分类题目解析算法原理代码 排序数组题目解析算法原理代码 数组中第K个最大元素题目解析算法原理代码 LCR 159. 库存管理 III题目解析算法原理代码 颜色分类 题目链接 题目解析 数组分为三块 算法原理 1.如果nums[i] 0&#xff0c;left, i下标对应元素交换&#xff0c…...

pyqtgraph绘制实时更新数据的图

PyQtGraph是一个基于PyQt和NumPy的Python库&#xff0c;它专为实时数据可视化而设计。以绘制0~2π范围的ysin(x)为例&#xff0c;基本用法的代码如下&#xff1a; # codingutf-8import pyqtgraph as pg from pyqtgraph.Qt import QtGui, QtCore import numpy as np# pyqtgraph…...

使用 MATLAB 绘制三维散点图:根据坐标和距离映射点的颜色和大小

在数据可视化中&#xff0c;三维散点图是一种非常直观的方式来展示数据的分布。MATLAB 提供了强大的 scatter3 函数&#xff0c;可以用来绘制三维散点图&#xff0c;而通过调整点的颜色和大小&#xff0c;可以进一步增强图形的表现力。 在本篇博客中&#xff0c;我们将逐步讲解…...

ubuntu离线安装docker

首先下载对应的版本amd64 就是x86的 https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/需要挑选其他版本 https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/下载之后上传到服务器目录&#xff0c;分别执行以下文件 sudo dpkg -…...

iOS如何操作更新推送证书

最近收到一份邮件,应该如何操作呢,证书还是跟以前一样冲钥匙串直接申请吗 Hello, As we announced in October, the Certification Authority (CA) for Apple Push Notification service (APNs) is changing. APNs will update the server certificates in sandbox on January…...

# issue 8 TCP内部原理和UDP编程

TCP 通信三大步骤&#xff1a; 1 三次握手建立连接; 2 开始通信&#xff0c;进行数据交换; 3 四次挥手断开连接&#xff1b; 一、TCP内部原理--三次握手 【第一次握手】套接字A∶"你好&#xff0c;套接字B。我这儿有数据要传给你&#xff0c;建立连接吧。" 【第二次…...

【Linux】-学习笔记08

第五章、DNS域名解析服务器 目录 第五章、DNS域名解析服务器 1.简介 1.1DNS简介 1.2因特网的域名结构 1.3域名服务器的类型划分 1.4DNS域名解析的过程 递归查询&#xff08;左侧&#xff09; 迭代查询&#xff08;右侧&#xff09; 2.DNS服务器配置 2.1关于服务端 …...

RFdiffusion Denoise类解读

Denoise 类为蛋白质结构扩散模型的实现提供了核心功能,通过灵活的噪声调度、潜力场引导和子结构对齐,使得模型可以生成物理合理的结构序列,并在每个时间步迭代更新蛋白质的坐标和结构信息。 源代码: def get_next_frames(xt, px0, t, diffuser, so3_type, diffusion_mask,…...

HTML5 拖拽 API 深度解析

一、HTML5 拖拽 API 深度解析 1.1 背景与发展 HTML5 的拖拽 API 是为了解决传统拖拽操作复杂而设计的。传统方法依赖鼠标事件和复杂的逻辑计算&#xff0c;而 HTML5 提供了标准化的拖拽事件和数据传递机制&#xff0c;使得开发者能够快速实现从一个元素拖拽到另一个元素的交互…...

Vue 的生命周期钩子函数是什么?常见的生命周期钩子有哪些?

Vue 的生命周期钩子函数 Vue 的生命周期钩子函数是 Vue 组件在不同生命周期阶段自动调用的函数。生命周期分为创建、挂载、更新和销毁等阶段。理解这些钩子函数对于开发和调试 Vue 应用至关重要&#xff0c;因为它们使我们能够在组件生命周期的不同阶段执行特定的操作。 目录…...

uniapp中导入uview或者uview plus

关于SCSS uview-plus依赖SCSS&#xff0c;您必须要安装此插件&#xff0c;否则无法正常运行。 如果您的项目是由HBuilder X创建的&#xff0c;相信已经安装scss插件&#xff0c;如果没有&#xff0c;请在HX菜单的 工具->插件安装中找到"scss/sass编译"插件进行安…...

3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移

3D 生成重建017-StyleGaussian用文本或图像对你的3DGS内容进行风格迁移 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 论文 “StyleGaussian: Instant 3D Style Transfer with Gaussian Splatting” 介绍了一种新颖的3D风格迁移方法 StyleGaussian&#xff0c;该方法通…...

【adb】iqoo系统精简垃圾内置应用

免责声明 这个得谨慎点&#xff0c;虽然我验证过两部手机和不同版本的系统&#xff0c;但是总会有特殊的存在、 本教程来自于互联网搜集整理&#xff0c; 按照本教程造成的用户设备硬件或数据损失&#xff0c;本人概不承担任何责任&#xff0c;如您不同意此协议&#xff0c;请不…...

Golang 字符串字面量表示方法

文章目录 1.普通字符串字面量&#xff08;Double-Quoted String Literals&#xff09;2.原始字符串字面量&#xff08;Raw String Literals&#xff09;3.字节字符串字面量&#xff08;Byte Slice Literals&#xff09;4.码值表示字符串字面量Unicode 转义序列UTF8 转义序列十六…...

【uni-app 微信小程序】新版本发布提示用户进行更新

知识准备 uni.getUpdateManager文档介绍 不支持APP与H5&#xff0c;所以在使用的时候要做好平台类型的判断&#xff0c;如何判断&#xff0c;参考条件编译处理多端差异 代码参考 export const updateApp () > {const updateManager uni.getUpdateManager()updateManag…...

Leetcode 739-每日温度

请根据每日 气温 列表 temperatures &#xff0c;请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 题解&#xff08;单调递减栈&#xff09; 什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任…...

Gitee配置以及如何将本地项目提交到远程仓库

文章目录 准备远程仓库配置注册新建仓库 配置git 生成ssh&#xff0c;输入以下命令&#xff0c;然后连敲三次回车键配置公钥本地代码上传 准备 1.本地下载git 2.注册远程仓库账号 远程仓库配置 注册 官网&#xff1a;https://gitee.com 完成注册 新建仓库 头像->设置-…...

爬虫项目基础知识详解

文章目录 Python爬虫项目基础知识一、爬虫与数据分析1.1 Python中的requests库Requests 库的安装Requests 库的 get() 方法爬取网页的通用代码框架HTTP 协议及 Requests 库方法Requests 库主要方法解析 1.2 python中的json库1.3 xpath学习之python中lxml库html了解html结构html…...

【Leetcode Top 100 - 扩展】876. 链表的中间结点

问题背景 给你单链表的头结点 h e a d head head&#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 数据约束 链表的结点数范围是 [ 1 , 100 ] [1, 100] [1,100] 1 ≤ N o d e . v a l ≤ 100 1 \le Node.val \le 100 1≤…...

16-01、JVM系列之:内存与垃圾回收篇(一)

JVM系列之&#xff1a;内存与垃圾回收篇&#xff08;一&#xff09; ##本篇内容概述&#xff1a; 1、JVM结构 2、类加载子系统 3、运行时数据区之&#xff1a;PC寄存器、Java栈、本地方法栈一、JVM与JAVA体系结构 JAVA虚拟机与JAVA语言并没有必然的联系&#xff0c;它只是与特…...

经典蓝牙(BT/EDR)蓝牙配对与连接

经典蓝牙的连接过程包括跳频&#xff0c;扫描&#xff0c;配置交换等过程。对ACL链路以及sco的连接过程也做详细的分析。 1. 为什么不配对便无法建立连接&#xff1f; 任何无线通信技术都存在被监听和破解的可能&#xff0c;蓝牙SIG为了保证蓝牙通信的安全性&#xff0c;采用…...

用 Python 从零开始创建神经网络(十四):L1 和 L2 正则化(L1 and L2 Regularization)

L1 和 L2 正则化&#xff08;L1 and L2 Regularization&#xff09; 引言1. Forward Pass2. Backward pass到此为止的全部代码&#xff1a; 引言 正则化方法旨在降低泛化误差。我们首先讨论的正则化形式是L1正则化和L2正则化。L1和L2正则化用于计算一个数值&#xff08;称为惩…...

特殊的数学性质

一个数模9的结果等于它的每一位数相加和模9...