MySQL基础关键_012_事务
目 录
一、概述
二、ACID 四大特性
三、MySQL 事务
四、事务隔离级别
1.说明
2.现象
(1)脏读
(2)不可重复读
(3)幻读
3.查看隔离级别
4.设置隔离级别
5.隔离级别
(1)初始化
(2)读未提交
(3)读提交
(4)可重复读
(5)串行化
6.可重复读的幻读
(1)说明
(2)快照读解决幻读
(3)当前读解决幻读
(4)出现幻读的两种情况
一、概述
- 事务是一个最小的工作单元。数据库中,事务表示一个完整的行为;
- 事务只针对 DML 语句;
- 使用事务机制后,在同一个事务当中,多条 DML 语句或同时执行成功,或同时执行失败;
- 事务的经典实例:账户转账,或一方金额减少和一方金额增加同时成功,或同时失败。
二、ACID 四大特性
- 原子性(Atomicity):事务包含的所有操作或全部成功,或全部失败;
- 一致性(Consistency):事务开始前和完成后,数据应该是一致的;
- 隔离性(Isolation):多个用户并发访问数据库时,数据库为每一个用户开启的事务不能被其他事务的操作所干扰,多个并发事务之间要相互隔离;
- 持久性(Durability):一个事务一旦被提交,则对数据库中的数据改变是永久的,即便是数据库系统出现故障也不会丢失提交事务的操作。
三、MySQL 事务
- 开启 MySQL 事务:【start transaction;】或【begin;】;
- 回滚事务:【rollback;】;
- 提交事务:【commit;】;
- 只要执行 rollback 或 commit,事务都会结束;
- MySQL 默认事务自动提交,执行一条 DML 语句提交一次。
四、事务隔离级别
1.说明
隔离级别 | 现 象 | ||
---|---|---|---|
脏读 | 不可重复读 | 幻读 | |
读未提交 (read uncommitted) | 存在 | 存在 | 存在 |
读提交 (read committed) | 不存在 | 存在 | 存在 |
可重复读 (repeatable read) | 不存在 | 不存在 | 存在 |
串行化 (serializable) | 不存在 | 不存在 | 不存在 |
- 隔离级别排序:读未提交 < 读提交 < 可重复读 < 串行化;
- 不同隔离级别会存在不同现象,按照严重性排序:脏读 > 不可重复读 > 幻读;
- Oracle 默认隔离级别是读提交,MySQL 默认隔离级别是可重复读。
2.现象
(1)脏读
一个事务读取了另一个事务尚未提交的数据。此时如果另一个事务回滚或修改了数据,那么读取脏数据的事务就会出现数据处理错误。
(2)不可重复读
一个事务内,多次读取同一条数据,得到的结果可能不一致。因为其他事务可能对该数据做出修改操作。
(3)幻读
事务执行过程中,前后几次相同查询条件得到的结果集不一致,可能更多也可能更少。
3.查看隔离级别
- 查看当前会话的隔离级别:【select @@transaction_isolation;】;
- 查看全局的隔离级别:【select @@global.transaction_isolation;】。
select @@global.transaction_isolation;select @@transaction_isolation;
4.设置隔离级别
- 设置当前会话的隔离级别:【set session transaction isolation level <隔离级别>】;
- 设置全局的隔离级别:【set global transaction isolation level <隔离级别>】。
# 设置全局隔离级别-- 读未提交
set global transaction isolation leve read uncommitted;-- 读提交
set global transaction isolation level read committed;-- 可重复读
set global transaction isolation level repeatable read;-- 串行化
set global transaction isolation level serializable;# 设置会话隔离级别-- 读未提交
set session transaction isolation leve read uncommitted;-- 读提交
set session transaction isolation level read committed;-- 可重复读
set session transaction isolation level repeatable read;-- 串行化
set session transaction isolation level serializable;
5.隔离级别
(1)初始化
事先准备好一个 users 表,表中有 id,name,gender 字段。
drop table if exists users;create table users(id int primary key auto_increment,name varchar(10),gender varchar(2) default '未知'
);insert into users(name, gender) values('黄梓婷', '女'),('赵聪', '男'),('吕不韦', '男');select * from users;
(2)读未提交
- A 事务与 B 事务,A 事务可以读到 B 事务未提交的数据;
- 这种级别的两个事务之间几乎没有隔离,实际数据库产品中,没有默认该隔离级别的;
- 但前隔离级别,脏读、不可重复读、幻读 现象都存在;
- 模拟实例:先将全局事务隔离级别设置为 read uncommitted。然后开启两个 dos 命令窗口分别登录 MySQL 来模拟 A、B事务。
-- 1.设置全局隔离级别
set global transaction isolation level read uncommitted;-- 2.然后打开两个 dos 命令窗口,分别登录 MySQL
A 事务 | B 事务 |
---|---|
3. mysql> use test; | |
4. mysql> use test; | |
5. mysql> start transaction; | |
6. mysql> start transaction; | |
7. mysql> select * from users; | |
8. mysql> insert into users(name, gender) values('陈子悦', '女'); | |
9. mysql> select * from users; |
可以看到,出现了脏读,意味着三个现象都会出现。
(3)读提交
- A 事务与 B 事务,A 事务可以读取到 B 事务提交之后的数据;
- Oracle 默认是此隔离级别;
- 当前隔离级别,会出现不可重复读和幻读现象;
- 模拟实例:先将全局事务隔离级别设置为 read committed。然后开启两个 dos 命令窗口分别登录 MySQL 来模拟 A、B事务。
-- 1.设置全局隔离级别
set global transaction isolation level read committed;-- 2.然后打开两个 dos 命令窗口,分别登录 MySQL
A 事务 | B 事务 |
---|---|
3. mysql> use test; | |
4. mysql> use test; | |
5. mysql> start transaction; | |
6. mysql> start transaction; | |
7. mysql> select * from users; | |
8. mysql> insert into users(name, gender) values('陈子悦', '女'); | |
9. mysql> select * from users; | |
9. mysql> commit; | |
10. mysql> select * from users; | |
11. mysql> update users set name = '牛佳佳' where id = 2; | |
12. mysql> select * from users; |
可以看到,出现了不可重复读和幻读。
(4)可重复读
- A 事务与 B 事务,A 事务开启后读取记录,B 事务修改数据并提交,A 事务读取到的还是修改前的记录;
- MySQL 默认是此隔离级别;
- 模拟实例:先将全局事务隔离级别设置为 repeatable read。然后开启两个 dos 命令窗口分别登录 MySQL 来模拟 A、B事务。
-- 1.设置全局隔离级别
set global transaction isolation level repeatable read;-- 2.然后打开两个 dos 命令窗口,分别登录 MySQL
A 事务 | B 事务 |
---|---|
3. mysql> use test; | |
4. mysql> use test; | |
5. mysql> start transaction; | |
6. mysql> start transaction; | |
7. mysql> select * from users; | |
8. mysql> update users set name = '艾东东' where id = 2; | |
9. mysql> select * from users; | |
10. mysql> commit; | |
11. mysql> select * from users; | |
12. mysql> insert into users(name, gender) values('张弘毅', '男'); | |
13. mysql> commit; | |
14. mysql> select * from users; | |
15. select * from users for update; |
# A 事务
mysql> use test;
Database changed
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> select * from users;
+----+--------+--------+
| id | name | gender |
+----+--------+--------+
| 1 | 黄梓婷 | 女 |
| 2 | 牛佳佳 | 男 |
| 3 | 吕不韦 | 男 |
| 5 | 陈子悦 | 女 |
+----+--------+--------+
4 rows in set (0.00 sec)mysql> select * from users;
+----+--------+--------+
| id | name | gender |
+----+--------+--------+
| 1 | 黄梓婷 | 女 |
| 2 | 牛佳佳 | 男 |
| 3 | 吕不韦 | 男 |
| 5 | 陈子悦 | 女 |
+----+--------+--------+
4 rows in set (0.00 sec)mysql> select * from users;
+----+--------+--------+
| id | name | gender |
+----+--------+--------+
| 1 | 黄梓婷 | 女 |
| 2 | 牛佳佳 | 男 |
| 3 | 吕不韦 | 男 |
| 5 | 陈子悦 | 女 |
+----+--------+--------+
4 rows in set (0.00 sec)mysql> select * from users;
+----+--------+--------+
| id | name | gender |
+----+--------+--------+
| 1 | 黄梓婷 | 女 |
| 2 | 牛佳佳 | 男 |
| 3 | 吕不韦 | 男 |
| 5 | 陈子悦 | 女 |
+----+--------+--------+
4 rows in set (0.00 sec)mysql> select * from users for update;
+----+--------+--------+
| id | name | gender |
+----+--------+--------+
| 1 | 黄梓婷 | 女 |
| 2 | 艾东东 | 男 |
| 3 | 吕不韦 | 男 |
| 5 | 陈子悦 | 女 |
| 6 | 张弘毅 | 男 |
+----+--------+--------+
5 rows in set (0.00 sec)
# B 事务
mysql> use test;
Database changed
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update users set name = '艾东东' where id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> commit;
Query OK, 0 rows affected (0.00 sec)mysql> insert into users(name, gender) values('张弘毅', '男');
Query OK, 1 row affected (0.02 sec)mysql> commit;
Query OK, 0 rows affected (0.00 sec)
可以看到 A 事务在使用【select * from users for update;】语句查询时会出现幻读,但是不加【for update】不会出现幻读。也就是说,幻读是可能会出现的,for update 是当前读。
(5)串行化
- 此隔离级别,避免了所有的问题;
- 但是效率低,因为这种隔离级别会导致事务排队处理,不支持并发;
- 模拟实例:先将全局事务隔离级别设置为 serializable。然后开启两个 dos 命令窗口分别登录 MySQL 来模拟 A、B事务。
-- 1.设置全局隔离级别
set global transaction isolation level serializable;-- 2.然后打开两个 dos 命令窗口,分别登录 MySQL
A 事务 | B 事务 |
---|---|
3. mysql> use test; | |
4. mysql> use test; | |
5. mysql> start transaction; | |
6. mysql> start transaction; | |
7. mysql> select * from users; | |
8. mysql> insert into users(name, gender) values('周子恩', '女'); | |
9. commit; |
在 B 事务执行完 insert 语句后,会等待 A 事务结束,否则 B 事务不会进入下一步。两个事务是串行执行的。
6.可重复读的幻读
(1)说明
- MySQL 默认隔离级别是可重复读,但是不可以完全避免幻读问题;
- 解决幻读的方法:
- 快照读:普通 select 语句都是快照读。通过 MVCC(多版本并发控制) 方式解决幻读,因为在可重复的隔离级别中,事务执行的查询数据与该事务启动时查询的数据是一致的,即使中间有新插入的数据,也不会被查询出来,所以避免了幻读问题;
- 当前读:带有 for update 的 select 语句、insert 语句、alert 语句、delete 语句都是当前读。通过 next-key lock(记录锁 + 间隙锁)的方式解决幻读,因为执行 select …… for update 语句时,会加上 next-key lock。若其他事务在 next-key lock 锁范围内插入了一条记录,则该语句会被阻塞,无法成功插入,所以也避免了幻读问题。
(2)快照读解决幻读
- 在整个事务处理过程中,执行相同的普通 select 语句,都是读取快照;
- 快照是固定某个时刻的数据;
- 原理:底层由 MVCC 实现,开始事务后,执行第一个查询语句后,会创建一个 read view,后续的查询语句利用该 read view,通过该 read view 可以在 undo log 版本链中找到事务开始时的数据,所以事务过程中每次查询到的数据是一致的。
(3)当前读解决幻读
- 每一次都读取最新数据;
- 事务开始,会对查询范围内的数据加锁,不允许其他事务对该范围内的数据进行增、删、改。即该 select 语句范围内的数据不允许并发,只能排队执行。next-key lock,就是 间隙锁 + 记录锁,间隙锁用来保证锁定范围内不允许执行 insert 操作,记录锁保证锁定范围不允许执行 update 和 delete 操作。
(4)出现幻读的两种情况
A 事务与 B 事务,在 A 事务中第一次查询使用快照读,B 事务插入数据。然后在 A 事务中第二次查询使用当前读,则会产生幻读现象;
A 事务与 B 事务,在 A 事务中第一次查询使用快照读,在 B 事务中插入数据。然后在 A 事务中更新 B 事务插入的那条记录。最后在 A 事务中再次使用快照读,则会产生幻读现象。(因为执行 update 操作,会在底层执行一次当前读)。
相关文章:
MySQL基础关键_012_事务
目 录 一、概述 二、ACID 四大特性 三、MySQL 事务 四、事务隔离级别 1.说明 2.现象 (1)脏读 (2)不可重复读 (3)幻读 3.查看隔离级别 4.设置隔离级别 5.隔离级别 (1)初始…...
Missashe考研日记-day35
Missashe考研日记-day35 1 专业课408 学习时间:3h学习内容: 完结撒花!!今天把OS最后一节的内容学完了,操作系统也算是告一段落了,接下来是计网时间!不过计网我是上学期才学过的,当…...
如何添加二级域名
在 华为云 上添加二级域名(如 sub.example.com)主要涉及 DNS解析配置 和 服务器绑定 两个步骤。以下是详细操作指南: 一、前提条件 已拥有 主域名(如 example.com)并完成 ICP备案(若服务器在中国大陆&#…...
【数据结构】01Trie
什么是 01Trie? 01Trie是字典树的一种变种,其只有两种情况,即 0 和 1,实现方式其实和字典树是一样的 有什么用呢? 其一般用于解决异或问题,是一种快速的数据结构,某些情况下可以无脑套用 实现方式&#…...
使用 CDN 在国内加载本地 PDF 文件并处理批注:PDF.js 5.x 实战指南
PDF.js 是一个强大的开源 JavaScript 库,用于在 Web 浏览器中渲染 PDF 文件。它由 Mozilla 开发,能够将 PDF 文档绘制到 HTML5 Canvas 或 SVG 上,无需任何本机代码或浏览器插件。对于许多需要在网页中展示 PDF 内容的应用场景来说,…...
SpringBoot指定项目层日志记录
1、新建一个Springboot项目,添加Lombok依赖(注意:这里使用的Lombok下的Slf4j快速日志记录方式) <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependenc…...
使用Mathematica内置函数绘制Sierpinski地毯
除了SierpinskiCurve之外,Mathematica还内置了SierpinskiMesh这个函数,用来绘制地毯。 SierpinskiMesh[n] gives a mesh region representing the n-step Sierpiński triangle. SierpinskiMesh[n,d] gives the n-step Sierpiński sponge in dimension…...
CMake笔记(简易教程)
CMake笔记 概述(需要提前了解的知识) 一个c/c程序从代码到生成二进制文件,需要经历的几个关键步骤:预编译(预处理)、编译、汇编、连接 【编译链接的几个步骤】 编译器:目前市面常见的编译器有…...
现代健康养生新范式:多维度守护身心活力
在快节奏的现代生活中,健康养生是维持高品质生活的关键。从环境调节到生活习惯养成,多个维度的协同发力,才能为健康注入持久动力。 良好的生活环境是健康的基础。室内空气流通至关重要,每天开窗通风 2-3 次,每次 30…...
推测式思维树:让大模型快速完成复杂推理
论文标题 Accelerating Large Language Model Reasoning via Speculative Search 论文地址 https://www.arxiv.org/pdf/2505.02865 作者背景 中科大,华为诺亚方舟实验室,天津大学 ICML 2025接收 动机 之前介绍过多篇投机解码(推测式解…...
软考错题(三)
telnet协议是一种基于TCP的远程登录协议 占用辅助空间最多的是归并排序 直接插入,堆排,简单选择,冒泡的空间复杂度是O(1) 快排是O(logn) 归并是O(n) B树的叶子节点通过指针链接为有序表,不是b-树 python中切片语法[start,end,s…...
注解的定义
一、理论说明 1. 注解的定义 Java 注解是从 JDK 5.0 开始引入的一种元数据机制,它可以为代码添加额外的信息,这些信息不影响程序的运行逻辑,但可以在编译期、类加载期或运行期被读取和处理。注解本质上是一种特殊的接口,所有注解…...
企业微信自建消息推送应用
企业微信自建应用来推送消息 前言 最近有个给特定部门推送消息的需求,所以配置一个应用专门用来推送消息。实现过程大致为:服务器生成每天的报告,通过调用API来发送消息。以前一直都是发邮件,整个邮箱里全是报告文件,…...
swagger3融入springboot
标签: 放controller上面 Api(description "xxx") 放方法上面 Operation(summary "xxx") 引入: 我用的是swagger3.X 需要在yml配置文件中加上: spring:mvc:pathmatch:matching-strategy: ant_path_matcher 然后生…...
CH32V208GBU6沁恒绑定配对获取静态地址
从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…...
[计算机科学#11]:编程语言简史,从二进制到简约表达的华丽转身,造就原因——“懒”
【核知坊】:释放青春想象,码动全新视野。 我们希望使用精简的信息传达知识的骨架,启发创造者开启创造之路!!! 内容摘要: 由于早期的编程需要直接操作硬件,例如使…...
Kubernetes HPA 深度解析:生产环境自动扩缩容实战指南
一、HPA 核心原理剖析 1. 运作机制三步曲 (图示:指标采集 → 决策计算 → 执行扩缩容的完整闭环) 指标采集层:通过 Metrics Server/Prometheus 等组件实时收集 CPU、内存或自定义指标决策计算层:根据当前指标值与目标阈值的比例计算所需副本…...
Matlab 四分之一车体被动和模糊控制对比
1、内容简介 Matlab215-四分之一车体被动和模糊控制对比 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
pm2如何执行脚本批量启动多个服务
在 PM2 中批量启动多个服务,可以通过以下几种高效方式实现,具体操作如下: 方法1:使用 ecosystem.config.js 配置文件(推荐) 步骤1:生成配置文件 在项目根目录运行以下命令,生成模板…...
Debian系统详解
以下是关于 Debian 操作系统 的超详细深度解析,涵盖历史、架构、功能特性、管理细节及应用场景等方面,帮助你全面掌握这一经典 Linux 发行版: 一、Debian 概述:开源社区的基石 1. 历史与定位 • 诞生:1993 年由 Ian…...
Dify X 奇墨科技,让AI大模型从“巨头专属”变为“触手可及”
AI大模型和AI Agent蓬勃发展,企业比拼的已不仅是AI技术储备,更是AI应用落地的实战能力。奇墨科技正式成为 AI 应用开发平台Dify中国大陆区企业版合作伙伴,帮助企业更便捷地接触到Dify并使用其开发AI应用。 Dify 是一款简单易用的 LLM 应用开…...
CSS相对定位与绝对定位
在网页设计里,相对定位(Relative Positioning)和绝对定位(Absolute Positioning)是 CSS(层叠样式表)里控制元素位置的关键手段。下面为你详细讲解它们的概念、特点与应用场景。 相对定位 概念…...
正则表达式(Regular Expression)详解
正则表达式(简称"regex"或"regexp")是一种强大的文本模式匹配工具,它使用特定语法来描述、匹配和操作字符串。 基本概念 正则表达式是由普通字符(如字母a到z)和特殊字符(称为"元…...
OpenCV-Python (官方)中文教程(部分一)_Day22
22.3 2D直方图 在前面的部分我们介绍了如何绘制一维直方图,之所以称为一维,是因为我们只考虑了图像的一个特征:灰度值。但是在 2D 直方图中我们就要考虑 两个图像特征。对于彩色图像的直方图通常情况下我们需要考虑每个的颜色(Hue)和饱和度&…...
【软考-高级】【信息系统项目管理师】【论文基础】采购管理过程输入输出及工具技术的使用方法
采购管理概念 项目采购管理包括从项目团队外部采购或获取所需产品、服务或成果的各个过程。项目采购管理包括编制和管理协议所需的管理和控制过程,例如合同、订购单、协议备忘录(MOA)和服务水平协议(SLA)。 采购管理…...
基于STM32、HAL库的CP2102-GMR USB转UART收发器 驱动程序设计
一、简介: CP2102-GMR是Silicon Labs公司生产的一款USB转UART桥接芯片,主要特点包括: 集成USB 2.0全速功能控制器 内置USB收发器,无需外部电阻 工作电压:3.0V至3.6V 支持的数据格式:数据位8,停止位1,无校验 最高支持1Mbps的波特率 内置512字节接收缓冲区和512字节发送…...
信息系统项目管理工程师备考计算类真题讲解十四
一、最小生成树问题 此问题采用破圈法来解决, 1)以1节点为例,找到路径最小 点:1--5:距离为3 2)找1--5最短的节点,选择4:1--5--4:距离为:5 3)找…...
二叉树的基本操作
二叉树的基本操作(C 语言版) 1 二叉树的定义 二叉树的图长这样: 二叉树是每个结点最多有两个子树的树结构,常被用于实现二叉查找树和二叉堆。二叉树是链式存储结构,用的是二叉链,本质上是链表。二叉树通常以结构体的形式定义,如下,结构体内容包括三部分:本节点所存储…...
网络基础入门第6-7集(抓包技术)
前言: 来自小迪安全v2023 内容: 第六集: 大致内容:burpsuit、茶杯、fiddler的抓包流程 1、安装抓包软件的相关证书 2、各大抓包软件的测试 注意用burp抓模拟器的数据包,需要将ip地址设置为本地的ip地址ÿ…...
自定义Widget开发:自定义布局实现
自定义Widget开发:自定义布局实现 一、Flutter布局系统基础 1. 布局约束(Constraints) 在Flutter中,布局系统基于约束(Constraints)的概念。每个widget都会接收来自其父widget的约束,并根据这…...
MyBatis(进阶)(xml标签)
本节⽬标 1. 学习MyBatis的动态SQL查询 2. 掌握MyBatis在项⽬中的应⽤, 可以使⽤Spring MVC完成⼀些基础的功能 1. 动态SQL(XML) 动态 SQL 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接 可以参考官⽅⽂档: M…...
英皇娱乐X乐华娱乐携手造星!“英皇乐华青少年艺人培训班”正式启动!
2025年5月8日,英皇娱乐集团与乐华娱乐集团联合宣布,双方将在北京市燕京实验中学合作开设“英皇乐华青少年艺人培训班”,为8至18岁的青少年提供专业的演艺及才艺学习平台。此次合作旨在集合两大娱乐公司在演艺行业的资源与优势,共同…...
Linux云计算训练营笔记day04(Rocky Linux中的命令)
mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件,没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录,没有改名 mv /opt/gongli tedu 移动目录,改名了 …...
枚举 · 例13-【模板】双指针
登录—专业IT笔试面试备考平台_牛客网 代码区: #include<algorithm> #include<iostream> #include<vector> #include<unordered_set> using namespace std;struct INTER{int left,right; }; bool compare(const INTER&a,const INTER&a…...
Linux网络编程day7 线程池and UDP
线程池 typedef struct{void*(*function)(void*); //函数指针,回调函数void*arg; //上面函数的参数 }threadpool_task_t; //各子线程任务的结构体/*描述线程池相关信息*/struct threadpool_t{pthread_mutex_t lock; …...
WHAT - ahooks vs swr 请求
文章目录 ahooks特点常用 Hooks 示例1. useRequest — 封装网络请求逻辑(比 SWR / React Query 更轻量)2. useDebounce — 防抖值3. useLocalStorageState — 本地存储的状态4. useBoolean — 快速管理布尔状态5. useEventListener — 添加事件监听 ahoo…...
算法训练营第十一天|150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素
150. 逆波兰表达式求值 题目 思路与解法 第一思路: 比较简单 class Solution:def evalRPN(self, tokens: List[str]) -> int:stack []for item in tokens:if item ! and item ! - and item ! * and item ! / :stack.append(item)else:b int(stack.pop())a …...
可视化图解算法35:在二叉树中找到两个节点的最近公共祖先(二叉树的最近公共祖先)
1. 题目 描述 给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。 数据范围:树上节点数满足 1≤n≤105 , 节点值val满足区间 [0,n) 要求:时间复杂度 O(n) 注:本题保…...
如果说开启的TIM3定时器有ccr1,ccr2,ccr3,我想要关闭ccr2的PWM输出,怎么通过代码实现
目录 作用概述: 具体原理: 代码的操作细节: 实际效果: 示意全文: 小结: TIM3->CCER & ~TIM_CCER_CC2E; 作用概述: 作用是禁用 TIM3 的通道 2(CCR2)的捕获…...
高能数造全固态电池干法电极高品质原纤化技术:驱动干法和全固态电池制造新进程
技术背景 传统湿法电极制备工艺的局限:传统的湿法电极制备工艺需要使用大量的溶剂来溶解粘结剂和分散活性物质,后续还需要复杂的干燥工序来去除溶剂。这不仅增加了生产成本和能源消耗,溶剂的使用和处理还会带来环境污染和安全隐患。 新能源产业发展的需…...
AI驱动的制造工艺:系统化探索与创新
DeepSeek 技术全景 在当今 AI 技术蓬勃发展的时代,DeepSeek 已成为该领域中一颗耀眼的明星。自 2023 年 7 月 17 日成立以来,这家由知名私募巨头幻方量化孕育而生的公司,迅速在 AI 领域崭露头角 。DeepSeek 的目标是开发顶尖的大语言模型(LLM),并利用数据蒸馏技术打造更精…...
Mac 平台获取地区标识符号
以下是添加了详细中文注释的代码版本,解释每一行代码的作用: #include <CoreFoundation/CoreFoundation.h> #include <vector> #include <string> #include <iostream>// 将 Core Foundation 的字符串(CFStringRef)转换为标准 …...
PyTorch 实战:从 0 开始搭建 Transformer
导入必要的库 python import math import torch import torch.nn as nn from LabmL_helpers.module import Module from labml_n.utils import clone_module_List from typing import Optional, List from torch.utils.data import DataLoader, TensorDataset from torch imp…...
Java 显式锁与 Condition 的使用详解
Java 显式锁与 Condition 的使用详解 在多线程编程中,线程间的协作与同步是核心问题。Java 提供了多种机制来实现线程同步,除了传统的 synchronized 关键字外,ReentrantLock 和 Condition 是更灵活且功能强大的替代方案。本文将详细介绍显式…...
【MySQL】存储引擎 - CSV详解
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
LeetCode算法题(Go语言实现)_62
题目 有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 “L” 的托米诺形。两种形状都可以旋转。 给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 7 取模 的值。 平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不…...
矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践
矿井设备通信破局:ModbusTCP转DeviceNet网关应用实践 在500米深的金属矿井中,传统人工操控采掘设备存在高风险、低效率问题。某矿业集团引入海希无线遥控器远程控制掘进机,却因通信协议冲突陷入困局:海希遥控器采用DeviceNet协议…...
GrassRoot备份项目
Windows服务项目 Grass.cs using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http.Headers; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Time…...
多级路由器如何避免IP冲突
在多级路由器架构中,避免IP冲突的核心在于合理规划子网、正确配置路由器角色与功能。以下是综合多个搜索结果的解决方案及操作步骤: 一、划分不同子网段 修改LAN口IP地址 主路由器默认LAN口IP为192.168.1.1,次级路由器需更改为不同网段&#…...
VGGNet详解
VGGNet 由牛津大学视觉几何组(Visual Geometry Group)在2014年提出,凭借极简的 33卷积核堆叠设计 成为经典模型,影响了后续大量网络架构。 1. 网络结构 VGGNet 的核心思想是 通过多层小卷积核(33)替代大卷…...