mysql 事务之LBCC与MVCC
一、事务
数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一系列操作,这些操作被当作一个逻辑单元进行处理,以保证数据的一致性和完整性。
ACID,事务四个关键特性
1、原子性(Atomicity)
- 原子性意味着事务中的所有操作要么全部完成,要么全部不完成。如果事务中的某个操作失败,那么整个事务应该回滚(撤销所有已经执行的操作),使数据库返回到事务开始前的状态。
2、一致性(Consistency)
- 一致性确保事务执行前后,数据库从一个一致状态转换到另一个一致状态。事务执行过程中,必须遵守所有数据库的完整性约束(如外键约束、唯一性约束等),以确保数据的逻辑正确性。
3、隔离性(Isolation)
- 隔离性保证多个事务并发执行时,一个事务的中间状态对其他事务是不可见的。这样,即使多个事务并发执行,每个事务都好像是在没有其他事务并发执行的情况下单独执行的。常见的隔离级别包括未提交读(Read Uncommitted)、提交读(Read Committed)、可重复读(Repeatable Read)和可串行化(Serializable)。
4、持久性(Durability)
- 持久性意味着一旦事务提交成功,即使系统崩溃,事务对数据库的影响也是永久的。事务的修改会被持久地保存在数据库中,不会丢失。
事务隔离级别
1、读未提交(Read Uncommitted)
- 特点:允许一个事务读取另一个事务尚未提交的数据。
- 问题:可能导致脏读(Dirty Read),即读取到可能最终会被回滚的数据。
2、读已提交(Read Committed)
- 特点:一个事务只能读取另一个事务已经提交的数据。
- 问题:可能导致不可重复读(Non-repeatable Read),即同一事务中多次读取同一数据可能得到不同的结果,因为其他事务可能在此期间对数据进行了修改。
3、可重复读(Repeatable Read)
- 特点:确保同一事务中多次读取同一数据得到相同的结果,即使其他事务在此期间对数据进行了修改。
- 问题:可能导致幻读(Phantom Read),即一个事务在读取某些数据行后,另一个事务插入了新行,导致第一个事务在后续读取时看到了这些新行。
4、串行化(Serializable)
- 特点:确保事务完全隔离,就像它们按某种顺序串行执行一样。
- 问题:性能开销最大,因为事务之间不能并发执行。
数据一致性问题
脏读(Dirty Read)
- 定义:事务A对一个值做修改,事务B读取这个值,但由于某种原因事务A回滚撤销了对这个值的修改,导致事务B读取到的值是无效数据。
- 影响:脏读可能会导致数据不一致的问题,因为读取到的数据可能是临时性的,尚未得到持久化,也可能被后续事务回滚掉。如果其他事务依赖于这个脏读数据进行后续操作,就可能导致系统出现错误或不一致的状态。
不可重复读(Non-repeatable Read)
- 定义:当事务A按照查询条件得到了一个结果集,这时事务B对事务A查询的结果集数据做了修改操作。之后事务A为了数据校验继续按照之前的查询条件查询,得到的结果集与前一次查询不同,导致不可重复读取原始数据。
- 影响:不可重复读可能导致事务在多次读取数据时得到不一致的结果,从而影响事务的正确性和一致性。
幻读(Phantom Read)
- 定义:当事务A按照查询条件得到了一个结果集,这时事务B对事务A查询的结果集数据做新增操作,之后事务A继续按照之前的查询条件查询时,结果集平白无故多了几条数据,好像出现了幻觉一样。
- 影响:幻读可能导致事务在读取数据时得到意外的结果,因为新的数据行在事务的两次读取之间被插入到了查询范围内。
二、InnoDB
MySQL InnoDB对隔离级别的支持
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读(未提交读) | 可能 | 可能 | 可能 |
已提交读(已提交) | 不可能 | 可能 | 可能 |
可重复读(可重复读) | 不可能 | 不可能 | 对InnoDB 不可能 |
串行化(Serializable) | 不可能 | 不可能 | 不可能 |
MySQL InnoDB 解决不可重复读和幻读
1、LBCC (Lock-Based Concurrent Control)
读锁
select * from sys_user where id = 1 for share
Concurrency: 读锁允许多个会话并发读取,但写操作会被阻塞。写锁会阻塞其他读操作和写操作。
写锁
-- 获取行级写锁
SELECT * FROM sys_user WHERE id = 1 FOR UPDATE;
根据算法,写锁可以细分为
- 记录锁(Record Lock)
记录锁是锁定单个行记录的锁,防止其他事务对此行进行update和delete等修改操作。
SELECT * FROM sys_user WHERE id = 1 FOR UPDATE;
上述语句会在 sys_user 表中,锁定 id 为 1 的那一行。
- 间隙锁 (Gap Lock)
当进行范围查询时,没有命中记录的时候会使用间隙锁,只对添加有效,允许修改不存在的值,既只对insert有效,update无效
间隙锁只锁定记录之间的间隙,而不锁定任何实际的记录。间隙锁用于防止其他事务在锁定的间隙中插入新记录。相同间隙锁之间不冲突
假设一个表的数据为
1、设置隔离级别为 REPEATABLE READ:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
2、开启事务并执行范围查询
间隙锁会锁住最后一个 key 的下一个左开右闭的区间,没有key就锁住无穷,防止幻读
START TRANSACTION;
-- 这条语句会锁定 id 在 10 和 20 之间的所有记录和间隙,锁住的是闭区间(10,20) 系统不存在数据
SELECT * FROM sys_menu_perm WHERE id <= 4 FOR UPDATE;-- 提交第一个事务后,再次尝试插入,可以成功
COMMIT;
3、在另一个事务中尝试插入(应被阻塞):
-- 另一个会话/事务中
START TRANSACTION;-- 试图插入一条记录到被锁定的间隙中
INSERT INTO sys_menu_perm (id, role_id) VALUES (5, 12); -- 被阻塞
update `saas`.sys_menu_perm set role_id = 5 where id = 8; -- 被阻塞
INSERT INTO sys_menu_perm (id, role_id) VALUES (7, 12); -- 不被阻塞
COMMIT;
- 临键锁(Next-Key Lock)
当我们使用了范围查询,不仅仅命中了Record 记录,还包含了 Gap间隙,在这种情况下我们使用的就是临键锁
临键锁是 MySQL 里面默认的行锁算法,相当于记录锁加上间隙锁。
临键锁不仅锁定了记录本身,还锁定了记录和前一条记录之间的间隙。这意味着它锁定了索引记录范围内的所有可能插入的位置。
假设有一个表的记录
1、设置隔离级别为 REPEATABLE READ:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
开启事务并执行范围查询(获取临键锁):
2、查询并锁定 id 在 2 和 5 之间的记录和间隙
临键锁,锁住最后一个 key 的下一个左开右闭的区间,没有key就锁住无穷,防止幻读
START TRANSACTION;SELECT * FROM employees WHERE id >= 2 AND id <= 11 FOR UPDATE; -- 验证插入是否被阻塞(在另一个事务中尝试插入):
左开右闭的区间,会锁住 2,(2,5],(5,9], (9,11],(11,15] -- 临键锁,锁住最后一个 key 的下一个左开右闭的区间。防止幻读-- 提交第一个事务后,再次尝试插入,可以成功
COMMIT;
3、验证插入是否被阻塞(在另一个事务中尝试插入)
-- 在另一个会话/事务中
START TRANSACTION;
-- 试图在已经锁定的间隙中插入新记录
INSERT INTO sys_menu_perm (id, role_id) VALUES (10, 12); -- 被阻塞INSERT INTO sys_menu_perm (id, role_id) VALUES (16, 12); -- 不被阻塞-- 试图在已经锁定的间隙中更新记录
update `saas`.sys_menu_perm set role_id = 15 where id = 15; -- 被阻塞COMMIT;
注意:
- 1、在读已提交(READ COMMITTED)隔离级别下,InnoDB 只会使用记录锁,不会应用间隙锁和临键锁。
- 2、不使用索引的话会锁住全表
- 3、在非唯一索引情况下,使用等值查询的时候,也会锁住下一个间隙,所有索引情况下,范围查询都会锁住下一个左开右闭的间隙
例如表数据如下
唯一索引
事务一:
START TRANSACTION;
-- 这条语句会锁定 id 在 8 和 (8,10] 的记录和间隙
SELECT * FROM `saas`.sys_menu_perm WHERE id = 8 FOR UPDATE;commit;事务二:
START TRANSACTION;
INSERT INTO `saas`.sys_menu_perm (id, role_id) VALUES (9, 9); -- 不会被阻塞
commit;
非唯一索引
事务一:
START TRANSACTION;
-- 这条语句会锁定 id = 8 的记录
SELECT * FROM `saas`.sys_menu_perm WHERE role_id = 8 FOR UPDATE;commit;事务二:
START TRANSACTION;
INSERT INTO `saas`.sys_menu_perm (id, role_id) VALUES (9, 9); -- 会被阻塞
commit;
原理
2、MVCC(Multi-Version Concurrency Control)
核心组件
1、版本链(Version Chain)
InnoDB通过为每行记录保存多个版本的快照来实现MVCC。这些版本通过隐式生成的列来管理,包括:
-
m_ids:Read View 创建时未提交的活跃事务 ID 列表。m_ids 不包括当前事务自己和已提交的事务(正在内存中)。
-
m_creator_trx_id:创建该 Read View 的事务 ID。
-
m_low_limit_id(max_trx_id):目前出现过的最大的事务 ID+1,即下一个将被分配的事务 ID。
-
m_up_limit_id(min_trx_id): m_ids 中最小的事务 ID,如果 m_ids 为空,则 m_low_limit_id为m_up_limit_id
2、隐藏字段:
- DB_TRX_ID:6字节,记录最近修改(修改/插入)该记录的事务ID。
- DB_ROLL_PTR:7字节,回滚指针,指向该记录的上一个版本(存储于rollback segment里),用于配合undo日志
- DB_ROW_ID:6字节,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引。
3、undo日志:
- insert undo log:事务在insert新记录时产生的undo日志,只在事务回滚时需要,并且在事务提交后可以被立即丢弃。
- update undo log:事务在进行update或delete时产生的undo日志,不仅在事务回滚时需要,在快照读时也需要,所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除。
4、Read View:
- 事务进行快照读操作时生成的读视图,在该事务执行快照读的那一刻,会生成数据库系统当前的一个版本视图,RR级别的Read View保持不变
Read View 可见性具体判断如下:
- DB_TRX_ID == m_creator_trx_id ,表示当前事务访问自己的记录。
- DB_TRX_ID < m_up_limit_id,说明生成该版本的事务在当前事务生成 Read View 之前已经提交,因此该版本可以被当前事务访问。
- DB_TRX_ID >= m_low_limit_id ,说明生成该版本的事务在当前事务生成 Read View 之后才提交,因此该版本不能被当前事务访问。
- m_low_limit_id > DB_TRX_ID >= m_up_limit_id ,检查 DB_TRX_ID 在m_ids 列表中,事务仍处于活跃状态,因此该版本不能被访问;如果不在列表中,说明在创建 Read View 时生成该版本的事务已经提交,因此该版本可以被访问。
快照读与当前读
1、快照读:
- 不加锁的select操作就是快照读,即不加锁的非阻塞读。
- 快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读。
- 快照读的实现基于多版本并发控制,即MVCC,它避免了加锁操作,降低了开销。
- 快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本。
2、当前读:
- 像select lock in share mode(共享锁)、select for update、update、insert、delete(排他锁)这些操作都是一种当前读。
- 当前读读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。
示例
表sys_menu_perm的数据如下
在各个时间段事务1、2 、3分别执行查询更新插入操作
分析:
T1 的 read view 为
字段 | 值 |
---|---|
m_ids | [T1] |
m_low_limit_id | T2 |
m_up_limit_id | T1 |
m_creator_trx_id | T1 |
T3 的 read view 为
字段 | 值 |
---|---|
m_ids | [T1,T3] |
m_low_limit_id | T4 |
m_up_limit_id | T1 |
m_creator_trx_id | T3 |
对于 Time 5 时刻,版本链数据为
对于事务T1,判断规则如下
-
ID = 6
链路第一条数据,DB_TRX_ID不存在,即为数据库的原始数据,可以访问的记录。 -
ID = 8
链路第一条数据,DB_TRX_ID = T2 ,DB_TRX_ID >= m_low_limit_id ,说明生成该版本的事务在当前事务生成 Read View 之后才提交,因此该版本不能被当前事务访问。
链路第二条数据,DB_TRX_ID不存在,即为数据库的原始数据,可以访问的记录。
对于事务T3,判断规则如下
- ID = 6
链路第一条数据,DB_TRX_ID不存在,即为数据库的原始数据,可以访问的记录。 - ID = 8
链路第一条数据,DB_TRX_ID = T2,m_low_limit_id > DB_TRX_ID >= m_up_limit_id ,检查 DB_TRX_ID 不在 m_ids 列表中,说明在创建 T3 的 Read View 时生成该版本的事务已经提交,因此该版本可以被访问。
对于 Time 9 时刻,版本链数据为
对于事务T1,判断规则如下
-
ID = 2
链路第一条数据,DB_TRX_ID = T3,DB_TRX_ID >= m_low_limit_id,说明生成该版本的事务在当前事务生成 Read View 之后才提交,因此该版本不能被当前事务访问。 -
ID = 6
链路第一条数据,DB_TRX_ID不存在,即为数据库的原始数据,可以访问的记录。 -
ID = 8
链路第一条数据,DB_TRX_ID = T1 ,DB_TRX_ID == m_creator_trx_id ,表示当前事务访问自己的记录。
相关文章:
mysql 事务之LBCC与MVCC
一、事务 数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一系列操作,这些操作被当作一个逻辑单元进行处理,以保证数据的一致性和完整性。 ACID,事务四个关键特性 1、原子性…...
记一次 .NET某hdp智能柜系统 卡死分析
一:背景 1. 讲故事 停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下: 被狗咬了 也不知道是不是出门没看黄历,在小区门口店里买烟&am…...
大模型专栏--Spring Ai Alibaba介绍和功能演示
Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。…...
【GPT】为什么人需要睡觉?
睡觉对人类来说是至关重要的生理和心理需求。以下是一些为什么人需要睡觉的主要原因,以及睡眠对身体和大脑的影响: 1. 恢复与修复 身体修复:在睡眠期间,身体进行细胞修复和再生。例如,生长激素在深度睡眠中分泌&#…...
【Linux】磁盘 | 文件系统 | inode
🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 模电好难啊ÿ…...
A051-基于Spring Boot的网络海鲜市场系统的设计与实现
🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...
谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的
最近不知怎么的,Chrome突然间打开百度很慢,甚至打不开。不光我一个人遇到这问题,我同事也遇到这个问题。开发中难免遇到问题,需要百度,现在是百度不了。 作为一名开发人员,习惯了使用Chrome进行开发&#…...
《企业级低代码开发平台技术要求》核心要点解析
一、引言 在数字化转型的浪潮中,企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》(T/SZAS 77—2024)为该领域提供了重要的规范与指引。深入剖析其核心要点,对于理…...
AI一键生成3D动画:腾讯最新方案,为小程序带来革命性变化
随着3D技术的快速发展,将静态的3D模型转化为能够生动展现各种动作的角色已经成为许多创作者和开发者梦寐以求的能力。然而,在过去,这一过程往往需要大量的手动工作和技术积累。现在,腾讯推出了一项创新的技术——AI一键生成3D动画,它不仅极大地简化了流程,还显著提高了效…...
AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复
在Altium Designer软件中,切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤: 切换三维视图 在PCB设计界面中,2D切换3D,快捷键按住数字键盘中的“3”即可切换; 快捷键ctrlf(或者vb快捷键也…...
【赵渝强老师】PostgreSQL的数据库
PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都…...
opencv 区域提取三种算法
opencv 区域提取三种算法 1.轮廓查找 findContours()函数,得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…...
C++初阶(十六)--STL--list的模拟实现
目录 结点类的实现 迭代器类的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 ->运算符的重载 运算符的重载 --运算符重载 !运算符重载 运算符重载 list类的模拟实现 成员变量 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 迭代器相关函数 …...
树莓集团:以人工智能为核心,打造数字化生态运营新典范
在当今数字化浪潮席卷全球的背景下,各行各业都在积极探索数字化转型的路径。作为数字产业的领军者,树莓集团凭借其深厚的技术积累和创新理念,在人工智能、大数据、云计算等前沿技术领域不断突破,成功打造了一个以人工智能为核心的…...
基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)
本研究提出了一种基于深度学习的十二生肖图像识别系统,旨在利用卷积神经网络(CNN)进行图像分类,特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型:ResNet50和VGG16,进行图像的特征提…...
Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展
Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型(LLM)的指南。Torchtune 是一个PyTorch库,旨在让您轻松地…...
ESLint
代码规范 一套写代码的约定规则;比如赋值符号左右是否需要空格,一句话结束是否要加;.... 代码规范错误 如果你的代码不符合standard的要求,ESLint(脚手架里配的东西)会告诉你哪个文件第几行错了 解决代码…...
小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现
项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:…...
如何具体实现商品详情的提取?
在电商领域,获取商品详情信息对于市场分析、价格比较、商品推荐等应用场景至关重要。本文将详细介绍如何使用Java编写爬虫程序,以合法合规的方式获取淘宝商品的详情信息,并提供详细的代码示例。 1. 环境准备 在开始编写爬虫之前,…...
antd table 自定义表头过滤表格内容
注意:该功能只能过滤可一次性返回全部数据的表格,通过接口分页查询的请自主按照需求改动哈~ 实现步骤: 1.在要过滤的列表表头增加过滤图标,点击图标显示浮窗 2.浮窗内显示整列可选选项,通过勾选单选或者全选、搜索框来…...
高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)
引言 在现代iOS应用开发中,处理大规模数据是一个常见的挑战。尤其实在直播项目中,礼物面板作为展示用户互动的重要部分,通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异,还需要保证高效的加载与渲…...
Maven - 优雅的管理多模块应用的统一版本号
文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...
C++设计模式(观察者模式)
一、介绍 1.动机 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”,即一个对象的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵…...
【unity】WebSocket 与 EventSource 的区别
WebSocket 也是一种很好的选择,尤其是在需要进行 双向实时通信(例如聊天应用、实时数据流等)时。与 EventSource 不同,WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下:…...
从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级
作者 | 白鲸开源 姜维 在数据集成和调度的领域,Informatica曾经是公认的权威工具。其强大的ETL功能、多年积累的市场经验,使其成为众多企业数据处理的核心工具。 然而,随着新一代大数据平台的迅速崛起,以及信创化改造的要求愈发严…...
第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放
文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…...
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求: 编译硬件需求:做多系统测试,磁盘500GB起步(固态)(机械会卡死),内存3…...
Web Worker 和 WebSocket的区别
Web Worker(消息传递机制) 定义:是为了在浏览器中提供多线程支持,允许 JavaScript 在后台线程运行,而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据,避免主线程(通常是 UI 线程&a…...
vmware Ubuntu2004运行STAR-Searcher
github链接 安装ros noetic gazebo11 略 gazebo更新方法 sudo sh -c echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable lsb_release -cs main" > /etc/apt/sources.list.d/gazebo-stable.list wget https://packages.osrfoundation.org/gaz…...
04_JavaScript引入到文件
JavaScript引入到文件 嵌入到HTML文件中 <body> <script> var age 20 </script></body> 引入本地独立JS文件 <body> <script type"text/javascript" src"./itbaizhan.js"> </script></body> 引入网络来…...
计算机网络的功能
目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络,用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…...
38 基于单片机的宠物喂食(ESP8266、红外、电机)
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用L298N驱动连接P2.3和P2.4口进行电机驱动, 然后串口连接P3.0和P3.1模拟ESP8266, 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…...
Git仓库迁移到远程仓库(源码、分支、提交)
单个迁移仓库 一、迁移仓库 1.准备工作 > 手动在电脑创建一个临时文件夹,CMD进入该目录 > 远程仓库上创建一个同名的空仓库 2.CMD命令:拉取旧Git仓库(包含提交、分支、源码) $ git clone --bare http://git.domain.cn/…...
Go语言压缩文件处理
目录 Go 语言压缩文件处理1. 压缩文件:Zip函数2. 解压文件:UnZip 函数3. 小结 Go 语言压缩文件处理 在现代的应用开发中,处理压缩文件(如 .zip 格式)是常见的需求。Go 语言提供了内置的 archive/zip 包来处理 .zip 文…...
Libevent库-http通信不同请求方式的处理
做项目的时候用到了http通信,同事用libevent库写的,特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...
Vue3 v-if与v-show的区别
v-if 与 v-show 我们都可以在开发中用于条件渲染,在面试时也是个常考的题目 实现原理 v-if:是真正的条件渲染,当v-if true时,元素会被创建、渲染,并插入到dom树中,这个过程会耗费系统的资源,当…...
同时在github和gitee配置密钥
同时在github和gitee配置密钥 1. 生成不同的 SSH 密钥 为每个平台生成单独的 SSH 密钥。 # 为 GitHub 生成密钥(默认文件路径为 ~/.ssh/github_id_rsa) ssh-keygen -t rsa -b 4096 -C "your_github_emailexample.com" -f ~/.ssh/github_id_…...
Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解
Scala集合概述-链接 大家可以点击上方链接,先对Scala的集合有一个整体的概念🤣🤣🤣 在 Scala 中,数组是一种特殊的集合类型,可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中,不可变…...
Failed to find SV in PRN block of SINEX file (Name svnav.dat)
gamit 精密星历生成失败 gamit svnav.dat没更新 下载svnav.dat.allgnss 重命名成 svnav.dat ,替换到tables,即可。...
H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件
EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器,凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能,以及出色的跨平台兼容性,为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...
Ubuntu上使用自带python创建虚拟环境
虚拟环境让项目之间的依赖关系更加清晰,也可以避免全局安装的包的版本冲突问题。 1.查看python Ubuntu上一般都是自带python的,查看python版本及指向(使用的话python要换成python3): ls -l /usr/bin | grep python 2.安装python虚拟环境工…...
对智能电视直播App的恶意监控
首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者,这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团,阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...
网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识
目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…...
微软企业邮箱:安全可靠的企业级邮件服务!
微软企业邮箱的设置步骤?如何注册使用烽火域名邮箱? 微软企业邮箱作为一款专为企业设计的邮件服务,不仅提供了高效便捷的通信工具,更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…...
matlab导出3D彩色模型(surface类转stl,并对白模上色)
在matlab中绘制3维图形时,需要将3维图形导出到PPT中展示。但是直接导出图片效果欠佳,无法全方位展示。 最近学习了如何将matlab中的图形导出为stl模型,然后再采用简单的方法对模型上色。 中间尝试过matlab导出stl、ply、3dm等多种格式&…...
【JavaScript】async /await异步详解2 promise举例
在 JavaScript 中,async 和 await 是处理异步操作的强大工具。结合 try...catch 语句,你可以优雅地处理异步操作中的错误。 基本用法 定义异步函数:使用 async 关键字。等待 Promise 解析:使用 await 关键字。错误处理ÿ…...
Android 设备使用 Wireshark 工具进行网络抓包
背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…...
封装类与封装函数
目录结构 src/ ├── utils/ │ ├── test.js │ ├── Calculator.js ├── views/ │ ├── Home.vue ├── App.vue 共同点:模块导出与模块引入 封装函数 场景 简单、轻量级和性能敏感的场景,适合快速开发和维护。 优 可维护性&…...
【java】接口幂等性的实现
文章目录 1. 引言介绍幂等性的概念为什么需要在Java接口中实现幂等性 2. 使用幂等表实现幂等性什么是幂等表如何设计幂等表示例:Java代码实现使用幂等表使用幂等表实现幂等性 3. 利用Nginx Lua 和 Redis实现幂等性Nginx和Lua的作用简介介绍Redis的SETNX命令架构设计…...
Leetcode 1.两数之和
题目意在对数组的快速查找 思路:哈希表 先创建一个哈希表,然后对数组进行遍历,iter代表用目标值依次减去遍历数组中的元素后得出的值,如果这个值在map中存在,则返回其索引和当前数组元素中的索引;若不存…...