MVCC实现原理
一、引言
在现代数据库管理系统中,数据的一致性和并发性是两个至关重要的特性。传统的锁机制虽然有效,但也存在着性能瓶颈,特别是在高并发环境下,锁的争用会导致系统响应时间变慢,甚至引发死锁等问题。为了克服这些挑战,多版本并发控制(MVCC,Multi-Version Concurrency Control)技术应运而生,成为了处理并发事务的一种非常有效的解决方案。本文将深入探讨MVCC的实现原理。我们先来思考一个问题,为什么innDB会需要MVCC?它可以解决什么问题呢?
二、为什么需要MVCC?
在开始这个话题之前,我们先来看看官方给出的MVCC定义:
MVCC多版本并发控制
Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。
通过官方的定义我们知道了MVCC是控制并发的一种方法,我们在代码层面去解决并发问题就是通过锁的方式去解决,同样我们数据库也提供了各种各样的锁。知道锁本身就是用于并发控制的,那么为什么 InnoDB 还需要引入 MVCC,读写都加锁不就可以控制住并发吗?
锁确实可以,但是性能太差。如果是纯粹的锁,那么写和写、读和写、读和读之间都是互斥 的。如果是读写锁,那么写和写、读和写之间依旧是互斥的。
数据库和一般的应用有一个很大的区别,就是数据库即便是读,也不能被写阻塞住。试想一 下,如果一个线程准备执行 UPDATE 一行数据,如果这时候阻塞住了所有的 SELECT 语句,这个性能是我们无法接受的。所以数据库要有一种机制,避免读写阻塞。在理解了为什么 MVCC 必不可少 之后,现在我们需要进一步了解一个和 MVCC 紧密关联的概念:隔离级别。
三、事务隔离级别
数据库的隔离级别是一组规则,用来控制并发访问数据库时如何分配、保护和共享资源。不同 的隔离级别在不同的并发控制策略之间进行调整,从而提供了不同的读写隔离级别和安全性。 用人话来说,就是隔离级别代表了一个事务是否了解别的事务以及了解程度怎么样。MySQL 支持的事务隔离级别分别为 读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和 串行化(SERIALIZABLE)。每个级别决定了事务在处理并发时的行为,并定义了事务如何处理并发事务带来的四种常见问题:脏读(Dirty Read)、不可重复读(Non-repeatable Read)、幻读(Phantom Read) 和 锁争用(Lock Contention)。
3.1 读未提交
在该隔离级别下,一个事务可以读取到另一个事务还没有提交的数据。这是最低级别的事务隔离,性能最好,但数据一致性最差。
3.2 读已提交
读已提交(Read Committed,简写 RC)是指一个事务只能看到已经提交的事务的修改。 这意味着如果在事务执行过程中有别的事务提交了,那么事务还是能够看到别的事务最新提交的修改。
3.3 可重复读
可重复读(Repeatable Read,简写 RR)是指在这一个事务内部读同一个数据多次,读到 的结果都是同一个。这意味着即便在事务执行过程中有别的事务提交,这个事务依旧看不到 别的事务提交的修改。这是 MySQL 默认的隔离级别。
3.4 串行化
是指事务对数据的读写都是串行化的。
从上到下,隔离性变强但是性能变差了。所以一个提升 MySQL 性能最简单的方式,就是将隔 离级别往下调。
不同的事务隔离级别也会出现各种不同的问题主要有以下几种:
- 脏读是指读到了别的事务还没有提交的数据。之所以叫做“脏”读,就是因为未提交数据可 能会被回滚掉。
- 不可重复读是指在一个事务执行过程中,对同一行数据读到的结果不同。
- 幻读是指在事务执行过程中,别的事务插入了新的数据并且提交了,然后事务在后续步骤中 读到了这个新的数据。
隔离级别 | 脏读 | 不可重复读 | 幻读 | 性能 |
---|---|---|---|---|
读未提交 | 允许 | 允许 | 允许 | 最高 |
读已提交 | 不允许 | 允许 | 允许 | 较高 |
可重复读 | 不允许 | 不允许 | 允许 | 默认 |
串行化 | 不允许 | 不允许 | 不允许 | 最低 |
四、当前读、快照读
在了解MVCC是如何解决事务并发带来的问题之前,需要先明白俩个概念,当前读、快照读。
4.1 当前读(Current Read)
定义:当前读是指读取数据时,事务会对正在读取的数据加锁,保证其他事务不能修改该数据。通常,当前读是为了避免并发事务之间的数据冲突。
特性:
- 加锁:当前读会加锁,通常是 行锁,比如使用 SELECT FOR UPDATE 或 SELECT LOCK IN SHARE MODE 语句。这种锁定会防止其他事务对相同数据行进行修改,确保事务中的读取操作得到保护。
- 事务一致性:通过加锁保证数据的一致性,但会导致其他事务的阻塞,影响并发性。
- 发生场景:通常在事务中更新、删除或插入数据时,MySQL 会执行当前读操作。
-- 当前读示例,会加锁防止其他事务修改这行数据
SELECT * FROM table_name WHERE id = 1 FOR UPDATE;
在执行该查询时,MySQL 会锁住id = 1
这一行数据,直到当前事务提交,其他事务不能修改该行数据。
4.2 快照读(Snapshot Read)
定义:快照读是指事务读取的数据是某个时间点的数据快照,不会受其他事务提交或回滚的影响。即便其他事务在该事务执行期间修改了数据,当前事务仍然会看到自己读取时的快照数据。简单来说,快照读就是在事务开始的时候创建了 一个数据的快照,在整个事务过程中都读这个快照。
特性:
- 不加锁:快照读通常不加锁,而是通过 多版本并发控制(MVCC) 来实现。在 MySQL 中,InnoDB 存储引擎使用 MVCC 来提供快照读操作,确保事务读取的数据在整个事务过程中保持一致。
- 避免阻塞:由于快照读不加锁,它允许更高的并发性,减少了事务间的阻塞。
- 一致性视图:事务读取数据时,会看到一个一致的视图(即快照),这个视图是事务开始时的数据状态,其他事务提交的更改对该事务不可见。
-- 快照读示例,读取数据不会加锁,看到的是事务开始时的数据快照
SELECT * FROM table_name WHERE id = 1;
在执行该查询时,如果事务开始时 id = 1
的数据为 100
,即使其他事务在这期间更新了该数据,当前事务依然会看到 100
这一数据,不会受到影响。
区别总结:
特性 | 当前读(Current Read) | 快照读(Snapshot Read) |
---|---|---|
是否加锁 | 是(行级锁) | 否(使用 MVCC) |
并发性 | 较低,会造成事务间的阻塞 | 较高,不会阻塞其他事务 |
数据一致性 | 保证事务读取的数据在整个事务期间不变 | 保证事务读取的数据在事务开始时一致 |
影响其他事务 | 会阻塞其他事务,直到事务提交 | 不会影响其他事务 |
适用场景 | 需要确保读取的数据在事务期间不被修改 | 只需要读取一致性视图的场景 |
五、MVCC实现原理
在这之前需要知道MVCC只在读已提交(Read Committed,简写 RC) 和
可重复读(Repeatable Read,简写 RR)这俩种隔离级别下适用。
MVCC实现原理是由俩个隐式字段、undo日志、Read view来实现的。
5.1 隐式字段
为了实现 MVCC,InnoDB 引擎给每一行都加了两个额外的字段 trx_id 和 roll_ptr。
trx_id:事务 ID,也叫做事务版本号。MVCC 里面的 V 指的就是这个数字。每一个事务在 开始的时候就会获得一个 ID,然后这个事务内操作的行的事务 ID,都会被修改为这个事务 的 ID。
roll_ptr:回滚指针。InnoDB 通过 roll_ptr 把每一行的历史版本串联在一起。
5.2 undo log
undo log细分为俩种,insert时产生的undo log、update,delete时产生的undo log
在Innodb中insert产生的undo log在提交事务之后就会被删除,因为新插入的数据没有历史版本,所以无需维护undo log。
update和delete操作产生的undo log都属于一种类型,在事务回滚时需要,而且在快照读时也需要,则需要维护多个版本信息。只有在快照读和事务回滚不涉及该日志时,对应的日志才会被purge
线程统一删除。
purge线程会清理undo log的历史版本,同样也会清理del flag标记的记录。
5.2.1 undo log在mvcc中的作用
写到这里关于undo log在mvcc中的作用估计还是蒙圈的。
undo log保存的是一个版本链,也就是使用DB_ROLL_PTR这个字段来连接的。
当数据库执行一个select语句时会产生一致性视图Read View。
那么这个Read View是由查询时所有未提交事务ID组成的数组,数组中最小的事务ID为min_id和已创建的最大事务ID为max_id组成,查询的数据结果需要跟Read View比较从而得到快照结果。
所以说undo log在mvcc中的作用就是为了根据存储的事务ID和一致性视图做对比,从而得到快照结果。
5.3 Read View
Read View 你可以理解成是一种可见性规则。前面你已经知道了 undolog 里面存放着历史版 本的数据,当事务内部要读取数据的时候,Read View 就被用来控制这个事务应该读取哪个 版本的数据。
Read View 最关键的字段叫做 m_ids,它代表的是当前已经开始,但是还没有结束的事务的 ID,也叫做活跃事务 ID。
Read View 只用于读已提交和可重复读两个隔离级别,它用于这两个隔离级别的不同点就在 于什么时候生成 Read View。
读已提交:事务每次发起查询的时候,都会重新创建一个新的 Read View。
可重复读:事务开始的时候,创建出 Read View。
5.3.1 Read View 与读已提交
在读已提交的隔离级别下,每一次查询语句都会重新生成一个 Read View。这意味着在事务执行过程中,Read View 是在不断变动的。现在我们来看一个例子,假如说现在已经有三个事务了,状态分别是已提交、未提交、未提交。
假如说现在新开了一个事务 A,分配给它的 ID 是 4。如果这个时候 A 开始查询 x 的值,那么 MySQL 会创建一个新的 Read View,其中 m_ids = 2,3。事务 A 发现最后一个已经提交 的是事务 trx_id = 1,对应的 x 的值是 3。于是事务 A 读到 x = 3。
如果这个时候事务 2 提交了,事务 A 再次读取 x,这个时候 MySQL 又会生成一个新的 Read View m_ids=3。因此事务 A 会读取到 x = 4。
5.3.2 Read View 与可重复读
在可重复读的隔离级别下,数据库会在事务开始的时候生成一个 Read View。这意味着整个 Read View 在事务执行过程中都是稳定不变的。我们用前面的例子来说明,就是在事务 A 开 始的时候就会创建出来一个 Read View m_ids=2,3。
如果这时候事务 A 去读 x 的数据,毫无疑问,读出来的是 x=3。
如果这时候事务 2 提交了,然后事务 A 想要再去读 x 的值,Read View 不会发生变化,还是 m_ids = 2,3。所以你可以看到,虽然事务 2 提交了,但是事务 A 完全不知道这回事,因此它还是读到 x=3。
六、小结
MVCC(多版本并发控制)通过为每个数据项维护多个版本来解决并发事务之间的冲突问题,从而提升数据库的并发性能。它的核心思想是通过为每个事务提供一致的视图,确保读取操作不会受到其他事务的影响。MVCC不依赖于传统的锁机制,减少了锁竞争,提高了并发性,尤其适合读多写少的应用场景。
相关文章:
MVCC实现原理
一、引言 在现代数据库管理系统中,数据的一致性和并发性是两个至关重要的特性。传统的锁机制虽然有效,但也存在着性能瓶颈,特别是在高并发环境下,锁的争用会导致系统响应时间变慢,甚至引发死锁等问题。为了克服这些挑…...
通过Golang的container/list实现LRU缓存算法
文章目录 力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2. 插入元素3. 删除元素4. 遍历链表5. 获取链表长度使用场景注意事项 源代码阅读 在 Go 语言中,container/list 包提供了一个双向链表的实现。链表是一种常见的数据结构&#…...
网络编程7天学java
* 网络编程:两台或两台以上的主机构成一个网络 * IP地址:标志网络中的一个通信实体的地址 * 端口号:区分不同应用程序 * 网络通信协议:ISO参考模型(7层),TCP/IP协议(4层)…...
在 IntelliJ IDEA 中配置 Git
1. 确保已安装 Git 在配置之前,确保你的系统已经安装了 Git。 检查是否已安装 Git: bash 复制 git --version 如果未安装,请前往 Git 官网 下载并安装。 2. 在 IntelliJ IDEA 中配置 Git 打开 IntelliJ IDEA。 进入设置: Windo…...
【Godot4.4】Rect2总结
概述 Rect2是2D场景中比较重要的一种数据类型。 Rect2的本质含义是2D场景的轴对齐包围盒,而不是可以自由变换的矩形。 Rect2提供了一些方法,可以方便的判断Rect2之间是否重叠、包含等,并可以获得重叠的区域。也可以获得两个Rect2的包围盒。…...
git使用命令总结
文章目录 Git 复制创建提交步骤Git 全局设置:创建 git 仓库:已有仓库? 遇到问题解决办法:问题一先git pull一下,具体流程为以下几步: 详细步骤 Git 复制 git clone -b RobotModelSetting/develop https://gitlab.123/PROJECT/123.git创建提…...
Unity DOTS从入门到精通之 C# Job System
文章目录 前言安装 DOTS 包C# 任务系统Mono 环境DOTS 环境运行作业NativeContainer 前言 作为 DOTS 教程,我们将创建一个旋转立方体的简单程序,并将传统的 Unity 设计转换为 DOTS 设计。 Unity 2022.3.52f1Entities 1.3.10 安装 DOTS 包 要安装 DOTS…...
linux下的网络抓包(tcpdump)介绍
linux下的网络抓包[tcpdump]介绍 前言tcpdump1. 安装 tcpdump2. 基本抓包命令3. 过滤器使用4. 保存捕获的数据包 异常指标1. 连接建立与断开相关指标异常 SYN 包异常 FIN 或 RST 包 2. 流量相关指标异常流量峰值异常源或目的 IP 流量 3. 端口相关指标异常端口使用端口扫描 4. 数…...
深入理解 Linux 中的 -h 选项:让命令输出更“人性化”
在 Linux 系统中,命令行工具是系统管理员和普通用户最常用的交互方式之一。然而,命令行输出往往充满了技术性术语和数字,对于初学者或非技术用户来说可能显得晦涩难懂。幸运的是,许多 Linux 命令都提供了一个非常实用的选项&#…...
selenium的鼠标操作
1、鼠标操作 鼠标时间对应的方法在那个类中? ActionChains类,实例化 鼠标对象 1、context_click(element) # 右击 2、double_click(element) #双击 3、double_and_drop(source, target) # 拖拽 4、move_to_element(element) # 悬停 【重点】 5、perform() …...
STM32——GPIO介绍
GPIO(General-Purpose IO ports,通用输入/输出接口)模块是STM32的外设接口的核心部分,用于感知外界信号(输入模式)和控制外部设备(输出模式),支持多种工作模式和配置选项。 1、GPIO 基本结构 STM32F407 的每个 GPIO 引脚均可独立配置,主要特性包括: 9 组 GPIO 端口…...
Word 小黑第15套
对应大猫16 修改样式集 导航 -查找 第一章标题不显示 再选中文字 点击标题一 修改标题格式 格式 -段落 -换行和分页 勾选与下段同页 添加脚注 (脚注默认位于底部 )在脚注插入文档属性: -插入 -文档部件 -域 类别选择文档信息,域…...
linux自启动服务
在Linux环境中,systemd是一个系统和服务管理器,它为每个服务使用.service文件进行配置。systemctl是用于控制系统服务的主要工具。本文将详细介绍如何使用systemctl来管理vsftpd服务,以及如何设置服务自启动。 使用Systemd设置自启动服务 创…...
react使用拖拽,缩放组件,采用react-rnd解决 -完整版
屏幕录制2025-03-10 10.16.06 以下代码仅提供左侧可视化区域 右侧数据根据你们的存储数据来 大家直接看Rnd标签设置的属性即可!!!!! /*** 用户拖拽水印的最终位置信息*/ export interface ProductWatermarkValue {wat…...
通过 ElasticSearch的Python API和`curl` 命令获取Elasticsearch 所有索引名称
导言 在大数据管理和实时搜索场景中,Elasticsearch 是一款不可或缺的工具。无论是开发调试、数据维护,还是系统监控,快速列出所有索引名称都是一个高频需求。本文将手把手教你如何通过 Python 客户端连接 Elasticsearch,并用两种方…...
Flutter:StatelessWidget vs StatefulWidget 深度解析
目录 1. 引言 2. StatelessWidget(无状态组件) 2.1 定义与特点 2.2 代码示例 3. StatefulWidget(有状态组件) 3.1 定义与特点 3.2 代码示例 4. StatelessWidget vs StatefulWidget 对比 5. StatefulWidget 生命周期 5.1…...
[密码学实战]Java实现国密TLSv1.3单向认证
一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…...
蓝桥杯省赛真题C++B组2024-握手问题
一、题目 【问题描述】 小蓝组织了一场算法交流会议,总共有 50 人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手(且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手(但这…...
项目实操分享:一个基于 Flask 的音乐生成系统,能够根据用户指定的参数自动生成 MIDI 音乐并转换为音频文件
在线体验音乐创作:AI Music Creator - AI Music Creator 体验者账号密码admin/admin123 系统架构 1.1 核心组件 MusicGenerator 类 负责音乐生成的核心逻辑 包含 MIDI 生成和音频转换功能 管理音乐参数和音轨生成 FluidSynth 集成 用于 MIDI 到音频的转换 …...
Java开发者如何接入并使用DeepSeek
目录 一、准备工作 二、添加DeepSeek SDK依赖 三、初始化DeepSeek客户端 四、数据上传与查询 五、数据处理与分析 六、实际应用案例 七、总结 【博主推荐】:最近发现了一个超棒的人工智能学习网站,内容通俗易懂,风格风趣幽默ÿ…...
多方安全计算(MPC)电子拍卖系统
目录 一、前言二、多方安全计算(MPC)与电子拍卖系统概述2.1 多方安全计算(MPC)的基本概念2.2 电子拍卖系统背景与需求三、MPC电子拍卖系统设计原理3.1 系统总体架构3.2 电子拍卖中的安全协议3.3 数学与算法证明四、数据加解密模块设计五、GPU加速与系统性能优化六、GUI设计与系…...
【数据库系统概论】第十一章 并发控制
第十一章 并发控制 11.1 并发控制概述(1)丢失修改(2)不可重复读(3)读“脏”数据 11.2 封锁11.2.1 封锁的概念11.2.2 基本封锁类型(1)排它锁/X锁/写锁(2)共享锁…...
C语言_数据结构总结4:不带头结点的单链表
纯C语言代码,不涉及C 0. 结点结构 typedef int ElemType; typedef struct LNode { ElemType data; //数据域 struct LNode* next; //指针域 }LNode, * LinkList; 1. 初始化 不带头结点的初始化,即只需将头指针初始化为NULL即可 void Init…...
用CSS画一条0.5px的线
上次面试前端被问到了这个问题,感觉有点懵懵的,我就回答了一个scaleY(0.5),这个是真的没想到,希望有需要的朋友可以去看看。随便记住一种就行。 1.第一种方式:通过缩放1px的线条实现视觉上的0.5px效果,兼容性较好。 …...
知识库全链路交互逻辑
阶段顺序 URL输入 → 网络连接 → 前端请求 → 后端处理 → 数据库交互 → 数据返回 → 前端渲染 → 连接关闭 阶段1:用户输入URL 用户行为:在浏览器地址栏输入 https://knowledge.com/search?keyword金融趋势 浏览器动作: “浏览器解析U…...
BambuStudio学习笔记:Model
# Model.hpp 核心模型结构说明## 文件概述 该头文件定义了3D打印数据处理的核心数据结构,包含模型对象、体积、实例、材料等关键类。主要功能包括: - 三维模型数据存储与管理 - 模型变换操作(平移/旋转/缩放) - 打印参数配置 - 多…...
Spring (八)AOP-切面编程的使用
目录 实现步骤: 1 导入AOP依赖 2 编写切面Aspect 3 编写通知方法 4 指定切入点表达式 5 测试AOP动态织入 图示: 一 实现步骤: 1 导入AOP依赖 <!-- Spring Boot AOP依赖 --><dependency><groupId>org.springframewor…...
【Go每日一练】构建一个简单的用户信息管理系统
👻创作者:丶重明 👻创作时间:2025年3月7日 👻擅长领域:运维 目录 1.😶🌫️题目:简单的用户信息管理系统2.😶🌫️代码开发3.😶&a…...
PathRAG:通过图剪枝的方法优化Graph-based RAG的性能方法浅析
PathRAG 也是一种新型 Graph-based RAG 方法,通过检索索引图中的关键关系路径,减少噪声并优化 LLM 提示。其核心创新在于基于流的剪枝算法和路径为基础的提示策略,特别适用于捕捉复杂数据集中的关系。(其实可以看做相比GraphRAG假…...
ElementUI 级联选择器el-cascader启用选择任意一级选项,选中后关闭下拉框
1、启用选择任意一级选项 在 el-cascader 标签上加上配置项: :props"{ checkStrictly: true }"例如: <el-cascaderref"selectedArrRef"v-model"selectedArr":options"optionsList":props"{ checkStri…...
【软件逆向】QQ 连连看小游戏去广告与一键消除实现
目录 一、背景介绍 二、去广告实现 2.1 分析广告加载流程 2.2 逆向分析广告加载逻辑 2.3 去广告方案 三、一键消除外挂实现 3.1 分析游戏逻辑 3.2 编写外挂插件 3.3 注入外挂: 四、一键消除效果展示 五、额外扩展 一、背景介绍 QQ 连连看是一款经典的休闲…...
vue el-select 省市区三级联动 vue + element-ui使用第三方插件实现省市区三级联动
vue el-select 省市区三级联动 vue使用第三方插件实现省市区三级联动 网上找了好多教程,都是使用el-cascader级联选择器的省市区选择器,但是几乎没有三个单独的el-select的进行关联的三级省市联动组件效果 第一步:先安装省市区element-ui的插件 npm install element-china-a…...
【GPT入门】第8课 大语言模型的自洽性
【GPT入门】第8课 大语言模型的自洽性 1.自洽性概念2.代码(观察执行结果)3.自洽性核心思想 1.自洽性概念 大模型的自洽性(self - consistency)是指在推理阶段,大模型通过生成多个答案并选择出现频率最高的那个&#x…...
工程化与框架系列(28)--前端国际化实现
前端国际化实现 🌍 引言 前端国际化(i18n)是现代Web应用中的重要组成部分,它能够让应用支持多语言和多地区的用户使用。本文将深入探讨前端国际化的实现方案和最佳实践,包括文本翻译、日期时间格式化、货币处理等方面…...
【阿里云】操作系统控制台操作体验与性能评测全解析
引言 在现代的云计算环境中,操作系统控制台是进行系统管理和运维的重要工具。它不仅帮助用户高效地管理云端资源,还提供了智能助手、系统诊断、性能观测等功能,能够提升操作系统的使用效率,增强用户的操作体验。本文简要介绍了操…...
面试之《IntersectionObserver的使用》
IntersectionObserver 是一个 Web API,用于异步观察目标元素与其祖先元素或顶级文档视口(viewport)交叉状态的变化。这在很多场景下非常有用,比如懒加载图片、实现无限滚动加载更多内容等。下面详细介绍它的使用方法。 基本原理 …...
在 Spring Boot 2.7.x 中引入 Kafka-0.9 的实践
文章目录 在 Spring Boot 2.7.x 中引入 Kafka-0.9 的实践一、下载 Kafka-0.9二、启动 Zookeeper 和 Kafka三、创建 Spring Boot 项目四、引入 kafka 依赖五、移除 Kafka 自动配置六、编写 Kafka 生产者6.1 Kafka配置类6.2 生产者监听类 七、编写Controller发送Kafka八、验证消费…...
【MACOS】用户数据过多
进入下面的路径下找到.Spotlight-V100文件夹 /System/Volumes/Data修改选线 通过终端权限不够 在finder中进行查看然后解锁 然后添加权限 使用代码查看存储数据。 diskutil apfs list...
鸿蒙系统中的持续部署
鸿蒙操作系统,作为一款面向未来的分布式操作系统,旨在为不同的设备提供统一的操作系统平台。它支持多种终端设备,包括但不限于智能手机、平板电脑、智能穿戴设备和物联网(IoT)设备等,并且能够实现跨平台的无…...
centos linux安装mysql8 重置密码 远程连接
1. 下载并安装 MySQL Yum 仓库 从 MySQL 官方网站下载并安装 Yum 仓库配置文件。 # 下载MySQL 8.0的Yum仓库包 wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm # 安装Yum仓库包 sudo rpm -ivh mysql80-community-release-el7-5.noarch.rpm2. 启…...
几种常见的虚拟环境工具(Virtualenv、Conda、System Interpreter、Pipenv、Poetry)的区别和特点总结
在 PyCharm 中创建虚拟环境是一个非常直接的过程,可以帮助你管理项目依赖,确保不同项目之间的依赖不会冲突。 通过 PyCharm 创建虚拟环境 打开 PyCharm 并选择或创建一个项目。 打开项目设置: 在 Windows/Linux 上,可以通过点击…...
VScode:运行程序停止后,频繁出现终端进程被终止
VScode里面powershell被迫关闭 bug场景排查原因解决办法 bug场景 系统:Windows IDE:Visual Studio Code 停止运行程序后,按向上箭头想要执行上一步命令,忽然终端页面强行关闭,并报错如下: 终端进程 &quo…...
PHP框架加载不上.env文件中的变量
以lumen5.5框架为例,根目录中bootstrap文件夹下的app.php文件中 (new Dotenv\Dotenv(__DIR__./../))->load(); 是读取所有.env中的文件的,这个是正常的,但是在代码中的任何位置或者在config目录下的databases.php里,代码如…...
Linux:基本指令与内涵理解
1.文件操作指令 1.1 ls ls指令用于查看指定层级文件夹下的文件或文件夹 基本格式:ls (选项) (查看层级) 其中选项处不写就默认是显示文件名,查看层级默认是当前层级 选项1: -l 作用:将查找文件的详细信息显示出来 我们…...
C++设计模式-抽象工厂模式:从原理、适用场景、使用方法,常见问题和解决方案深度解析
一、模式基本概念 1.1 定义与核心思想 抽象工厂模式(Abstract Factory Pattern)是创建型设计模式的集大成者,它通过提供统一的接口来创建多个相互关联或依赖的对象族,而无需指定具体类。其核心思想体现在两个维度: …...
LINUX系统安装+添加共享目录
一、前言 Windows或mac系统中创建Linux工作环境是基于VMware和SL(Scientific Linux),下面分别安装二者。 二、VMware软件安装及注册 1、双击VMware安装包 2、点击下一步 3、 勾选接受许可,并点击下一步 4、更改路径(建议更改为容易找到的路…...
《UE5_C++多人TPS完整教程》学习笔记34 ——《P35 网络角色(Network Role)》
本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P35 网络角色(Network Role)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author) Stephe…...
成为git砖家(9): rebase进阶: 拆分commit为多个
问题描述 当一次性 git add 了多个修改点, 并且快速的执行了 git commit 后, 你觉得有点懊恼: 明明可以独立为两次或多次 commit, 揉在一块导致历史记录不太清晰。 比如我在 nn1 这个练手项目中, 最近一次 commit&am…...
pytorch retain_grad vs requires_grad
requires_grad大家都挺熟悉的,因此穿插在retain_grad的例子里进行捎带讲解就行。下面看一个代码片段: import torch# 创建一个标量 tensor,并开启梯度计算 x torch.tensor(2.0, requires_gradTrue)# 中间计算:y 依赖于 x&#x…...
Axure常用变量及使用方法详解
点击下载《Axure常用变量及使用方法详解.pdf》 摘要 Axure RP 作为一款领先的前端原型设计工具,提供了全面的 变量 和 函数 系统,以支持复杂的交互设计和动态内容展示。本文将从专业角度详细解析 Axure 中的 全局变量、中继器数据集变量/函数、元件变量…...