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

[MySQL初阶]MySQL(9)事务机制

标题:[MySQL初阶]MySQL(9)事物机制
@水墨不写bug

在这里插入图片描述


文章目录

  • 一、认识事务
    • 1、多线程访问数据库出现的问题
    • 2、对CURD的限制是通过事务机制实现的
    • 3、事务的四个属性
    • 4、哪些引擎支持事务
  • 二、事务的提交与autocommit设置
  • 三、事务的隔离性和隔离级别
    • (1) 查看当前隔离级别
    • (2) 设置隔离级别
    • (3) 事务隔离级别的作用
    • (4)MySQL InnoDB 的四种隔离级别
      • (1) 读未提交(Read Uncommitted)
      • (2) 读已提交(Read Committed)
      • (3) 可重复读(Repeatable Read)
      • (4) 串行化(Serializable)
    • (5)各隔离级别对比表
  • 四、事务的一致性
      • 1. AID 特性与一致性的关系
        • (1) 原子性(Atomicity)
        • (2) 隔离性(Isolation)
        • (3) 持久性(Durability)
        • (4) 应用层逻辑(用户的配合)


一、认识事务

1、多线程访问数据库出现的问题

MySQL是一款网络服务,那么必定有多个客户端同时访问服务器的场景出现:假如有一个抢票系统,有两个客户端抢票,一个客户端抢票之后,数据库还没有及时更新,这张票又被另一个客户端抢了一次,一张票被卖了两次。这不符合逻辑!
于是,必须要对数据库的CURD操作进行一定的限制,才能解决上面的问题。

2、对CURD的限制是通过事务机制实现的

事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。
事务主要用于处理操作量大,复杂度高的数据。比如要删除一个被开除的员工的所有历史信息以及和他相关的信息,就需要多条 MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。

但是要知道,同一时刻并不是只有一个事务在运行,而是有多个事务同时在运行。如果大量的事务在不加保护的情况下访问同一个表数据,就一定会出现问题。因为事务由多条sql语句组成,一个事务执行了一半,突然mysql客户端挂了,那么这执行了一半的事务该怎么处理?

3、事务的四个属性

于是,MySQL规定,一个完整的事务,不仅仅是简单的sql语句的组合,还要满足下面的四个属性

原子性(Atomicity,或称不可分割性): 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误(导致客户端挂了),执行了一半的事务会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性(Consistency): 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
隔离性(Isolation,又称独立性): 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交( Read uncommitted )、读提交( read committed )、可重复读( repeatable read )和串行化( Serializable )。
持久性(Durability): 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

此外,事务本质上是为应用层服务的。因为我们并不是直接访问数据库的,而是通过上层的各种语言来范围访问数据库的,于是多条sql语句封装出来的事务可以简化上层的编程模型和逻辑。

4、哪些引擎支持事务

使用指令查询:

mysql> show engines\G;
*************************** 1. row ***************************Engine: ndbclusterSupport: NOComment: Clustered, fault-tolerant tables
Transactions: NULLXA: NULLSavepoints: NULL
*************************** 2. row ***************************Engine: MEMORYSupport: YESComment: Hash based, stored in memory, useful for temporary tables
Transactions: NOXA: NOSavepoints: NO
*************************** 3. row ***************************Engine: InnoDBSupport: DEFAULTComment: Supports transactions, row-level locking, and foreign keys
Transactions: YESXA: YESSavepoints: YES
*************************** 4. row ***************************Engine: PERFORMANCE_SCHEMASupport: YESComment: Performance Schema
Transactions: NOXA: NOSavepoints: NO
*************************** 5. row ***************************Engine: MyISAMSupport: YESComment: MyISAM storage engine
Transactions: NOXA: NOSavepoints: NO
*************************** 6. row ***************************Engine: FEDERATEDSupport: NOComment: Federated MySQL storage engine
Transactions: NULLXA: NULLSavepoints: NULL
*************************** 7. row ***************************Engine: ndbinfoSupport: NOComment: MySQL Cluster system information storage engine
Transactions: NULLXA: NULLSavepoints: NULL
*************************** 8. row ***************************Engine: MRG_MYISAMSupport: YESComment: Collection of identical MyISAM tables
Transactions: NOXA: NOSavepoints: NO
*************************** 9. row ***************************Engine: BLACKHOLESupport: YESComment: /dev/null storage engine (anything you write to it disappears)
Transactions: NOXA: NOSavepoints: NO
*************************** 10. row ***************************Engine: CSVSupport: YESComment: CSV storage engine
Transactions: NOXA: NOSavepoints: NO
*************************** 11. row ***************************Engine: ARCHIVESupport: YESComment: Archive storage engine
Transactions: NOXA: NOSavepoints: NO
11 rows in set (0.01 sec)

从查询结果可知,目前只有InnodeDB引擎支持事务机制


二、事务的提交与autocommit设置

事务的提交(commit)方式有两种:
自动提交;
手动提交;
autocommit变量是设置是否自动提交。
查看autocommit变量:

show variables like 'autocommit';

设置是否自动提交:

SET AUTOCOMMIT=1; #SET AUTOCOMMIT=1 开启自动提交
SET AUTOCOMMIT=0; #SET AUTOCOMMIT=0 禁止自动提交

当我们想要开始一个事务,需要指令:

begin;
#或者
start transaction;

当我们想要提交一个事务,需要指令:

commit;

而这两个指令之间的sql语句就是事务的内容。


为了方便后面的演示,这里我们创建一个表结构如下:

create table if not exists account(id int primary key,name varchar(50) not null default '',blance decimal(10,2) not null default 0.0)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

此时暂时把全局隔离级别设置为读未提交【为了方便通过另一个客户端查看表中的数据】:

set global transaction isolation level READ UNCOMMITTED;

查看隔离级别:

SELECT @@global.transaction_isolation AS '全局隔离级别', @@session.transaction_isolation AS '当前会话隔离级别';

重启mysql,同步当前会话和全局的隔离级别,然后查看:
在这里插入图片描述

  • 特性一:如果事务通过begin/start transation方式开始,则必须通过commit提交,这样才会持久化,与是否设置autocommit无关(默认情况下autocommit是ON打开的,至于具体有什么用,在后文会讲)。

如果有两个客户端同时访问同一张表,同时启动了两个事务,一个客户端事务执行了一半,崩溃了,MySQL会自动回滚


什么是回滚?
当我们开始一个事务之后,在事务执行的过程中,可以创建保存点,这个保存点可以理解为游戏中的存档点,如果对于最新的操作不满意,可以回滚(读取存档点):

savepoint s1; #创建一个保存点s1

首先,通过begin;开启一个事务。
然后,我们在已经创建的表中插入数据:
在这里插入图片描述
此时设置一个savepoint s1;
在这里插入图片描述
然后再次进行一些增删改操作(比如新插入一条数据):
在这里插入图片描述
但是发现在新进行的操作出错了,不想要了,于是可以回滚(读取存档点s1):

rollback to s1;

结果:
在这里插入图片描述
于是,新插入的一条“haha”的数据就被删除了。这就是回滚


回到特性一的演示:
证明:未commit,客户端崩溃,MySQL自动会回滚[因为通过手动开始,autocommit不会自动提交]
启动两个事务,左侧插入一个新数据lisi,右侧可以看到新插入的数据:

在这里插入图片描述
左侧事务的客户端被ctrl+\ 被发送abort信号,进程被杀死,右侧客户端发现新插入的lisi被MySQL自动回滚了。
在这里插入图片描述

证明:commit了,客户端崩溃,MySQL数据不会再受影响,已经持久化。[因为通过手动开始,autocommit不会自动提交]

启动两个事务,左侧客户端插入数据jimmay,commit之后被信号杀死,右侧查询可以找到新插入的数据:
在这里插入图片描述

证明:没有手动通过begin;/start transaction;启动一个事务,autocommit会对提交产生影响。

在autocommit=1;(开启)的情况下:
对于没有手动通过begin;/start transaction;启动一个事务,一条sql语句就是一个事务,因为每一条语句都会被包装为一个事务。
即使一条语句被执行后,客户端直接崩溃,语句仍然被持久化:
在这里插入图片描述
在autocommit=0;(开启)的情况下:
需要手动commit,无论执行了多少操作,如果在客户端退出之前没有commit,则所有的操作都会被回滚:
在这里插入图片描述
如果commit了,做的操作就会被持久化:
在这里插入图片描述


到这里,我们可以总结一下:

  • 事务开始是用begin/start transaction,需要手动commit提交,才会持久化,不收到autocommit设置的影响。
  • 事务可以通过设置savepoint手动回滚;当操作异常时,MySQL会自动回滚。
  • InnoDB 每一条 SQL 语言都默认封装成事务自动提交。(select有特殊情况,因为MySQL 有 MVCC )。
  • 从上面的演示,我们能看到事务本身的原子性(回滚),持久性(commit)。

从哪里体现隔离性?


三、事务的隔离性和隔离级别

数据库中,为了保证事务执行过程中尽量不受干扰,就有了一个重要特征:隔离性
数据库中,允许事务受不同程度的干扰,就有了一种重要特征:隔离级别

(1) 查看当前隔离级别

SHOW VARIABLES LIKE 'transaction_isolation';
-- 输出示例:transaction_isolation = REPEATABLE-READ

(2) 设置隔离级别

-- 全局设置(重启后生效)
SET GLOBAL TRANSACTION ISOLATION LEVEL+隔离登记;
-- 当前会话设置
SET SESSION TRANSACTION ISOLATION LEVEL+隔离登记;

MySQL InnoDB 存储引擎支持四种标准的事务隔离级别,它们通过不同的锁机制多版本并发控制(MVCC) 实现事务之间的数据可见性和并发控制。


(3) 事务隔离级别的作用

事务隔离级别定义了多个并发事务之间的数据可见性规则,核心目标是解决以下问题:

  • 脏读(Dirty Read):读到其他事务未提交的数据。
  • 不可重复读(Non-Repeatable Read):同一事务中多次读取同一数据,结果不一致(其他事务修改了该行)。
  • 幻读(Phantom Read):在同一事务中,由于其他事务插入或删除了符合查询条件的行,导致多次相同查询的结果集行数不一致。

(4)MySQL InnoDB 的四种隔离级别

按隔离级别从低到高排序:

(1) 读未提交(Read Uncommitted)

  • 特点:所有的事务都可以看到其他事务没有提交的
    执行结果(可能读到“脏数据”)相当于没有任何隔离性。
  • 问题:存在 脏读、不可重复读、幻读
  • 实现方式:几乎不加锁,依赖最低限度的锁机制。
  • 使用场景:极少使用,仅在需要最高并发且不关心数据一致性的场景。

(2) 读已提交(Read Committed)

  • 特点:一个事务只能看到其他的已经提交的事务所做的改变。
  • 解决的问题:避免脏读。
  • 遗留问题:存在 不可重复读、幻读
  • 实现方式
    • 锁机制:使用 行级锁(Record Locks),写操作锁定当前行。
    • MVCC:每次 SELECT 生成一个独立的快照(一致性视图),基于当前已提交的数据。
  • 使用场景:适用于大多数 OLTP 系统(如 Oracle 默认级别)。

(3) 可重复读(Repeatable Read)

  • 特点: MySQL 默认的隔离级别,同一事务中多次读取同一数据的结果一致。
  • 解决的问题:避免脏读、不可重复读。
  • 遗留问题:仍可能发生 幻读(但 InnoDB 通过 间隙锁 基本消除)。
  • 实现方式
    • 锁机制:使用 记录锁(Record Locks) + 间隙锁(Gap Locks)(合称 临键锁 Next-Key Locks)。
    • MVCC:事务首次 SELECT 生成一致性视图,后续读取沿用该视图。
  • 默认级别:InnoDB 的默认隔离级别。
  • 幻读的解决
    -- 事务A
    BEGIN;
    SELECT * FROM users WHERE age > 20; -- 假设返回3条记录-- 事务B
    INSERT INTO users (id, age) VALUES (4, 25); -- 提交-- 事务A再次查询
    SELECT * FROM users WHERE age > 20; -- 在可重复读下,仍然返回3条记录(避免幻读)
    

(4) 串行化(Serializable)

  • 特点:事务的最高隔离级别,所有事务串行执行,完全隔离。
  • 解决的问题:避免脏读、不可重复读、幻读。
  • 实现方式
    • 锁机制:所有 SELECT 自动转换为 SELECT ... FOR SHARE,使用共享锁,导致读写冲突时阻塞。
    • MVCC:基本失效,强制串行化。
  • 使用场景:对数据一致性要求极高,但性能极低,很少使用。

(5)各隔离级别对比表

隔离级别脏读不可重复读幻读锁机制性能
读未提交可能可能可能行级写锁最高
读已提交可能可能行级写锁 + MVCC
可重复读(InnodeDB默认)无*临键锁 + MVCC中等
串行化表级锁或严格的行级锁最低

*InnoDB 在可重复读级别下通过间隙锁基本消除幻读。


四、事务的一致性

事务的 一致性(Consistency) 需要 原子性(Atomicity)隔离性(Isolation)持久性(Durability) 以及 应用层的正确逻辑(用户的配合) 共同维护。


1. AID 特性与一致性的关系

事务的 ACID 特性中,一致性(Consistency)是最终目标,而其他三个特性(原子性、隔离性、持久性)是实现一致性的技术手段。同时,应用层逻辑(用户代码)的合理设计是确保一致性的必要条件。

(1) 原子性(Atomicity)
  • 作用:事务内的操作要么全部成功,要么全部失败回滚。
  • 对一致性的贡献:防止部分操作失败导致数据处于“半完成”状态。
    -- 示例:转账操作(原子性保证)
    BEGIN;
    UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;  -- 扣款
    UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;  -- 入账
    COMMIT; -- 若任何一步失败,整个事务回滚,避免数据不一致。
    
(2) 隔离性(Isolation)
  • 作用:控制并发事务之间的相互影响。
  • 对一致性的贡献:防止脏读、不可重复读、幻读等问题破坏数据逻辑。
    -- 示例:隔离级别避免中间状态暴露
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    BEGIN;
    SELECT balance FROM accounts WHERE user_id = 1;  -- 基于快照的一致性视图
    -- 其他事务的修改不会影响当前事务的查询结果
    COMMIT;
    
(3) 持久性(Durability)
  • 作用:事务提交后,修改必须永久保存到存储介质(如磁盘)。
  • 对一致性的贡献:确保提交后的数据在故障后仍可恢复,避免数据丢失导致不一致。
    -- 提交后数据写入磁盘(通过 Redo Log 等机制保证)
    COMMIT;
    
(4) 应用层逻辑(用户的配合)
  • 作用:开发者需确保业务规则被正确编码。
  • 对一致性的贡献:数据库无法自动理解业务规则,需通过代码显式维护。
    -- 示例:应用层必须检查转账的用户减去金额,转到的用户加上相应的金额。
    BEGIN;
    UPDATE accounts SET balance = balance - amount WHERE user_id = 1;
    UPDATE accounts SET balance = balance + amount WHERE user_id = 2;
    COMMIT;
    

完~
转载请注明出处

在这里插入图片描述

相关文章:

[MySQL初阶]MySQL(9)事务机制

标题:[MySQL初阶]MySQL(9)事物机制 水墨不写bug 文章目录 一、认识事务1、多线程访问数据库出现的问题2、对CURD的限制是通过事务机制实现的3、事务的四个属性4、哪些引擎支持事务 二、事务的提交与autocommit设置三、事务的隔离性和隔离级别…...

3535 数组分割

3535 数组分割 ⭐️难度:困难 🌟考点:2023、省赛、动态规划 📖 📚 import java.util.*;public class Main {static int MOD 1000000007;static int N 1005;public static void main(String[] args) {Scanner sc …...

线程池的工作原理

固定线程池:线程池中的线程数是固定的,线程池创建时就已经设定了固定的线程数量。在任务提交时,线程池会将任务分配给空闲的线程执行。如果所有线程都在执行任务,新的任务会被放到任务队列中,直到有线程空闲出来。 线…...

论文导读 | SOSP23 | Gemini:大模型 内存CheckPoint 快速故障恢复

本期分享的是一篇SOSP 2023论文: Gemini: Fast Failure Recovery in Distributed Training with In-Memory Checkpoints Zhuang Wang (Rice University), Zhen Jia (Amazon Web Services, Inc.), Shuai Zheng (Amazon Web Services), Zhen Zhang (Amazon Web Servic…...

windows 常用命令总结

工作中用到的 Linux 总结(持续更新中...)_linux工作经验-CSDN博客 PS: 推荐使用 powershell 而不是 cmd,因为PowerShell 是一个更先进和功能更强大的工具( powershell 有命令记忆功能,比较方便&#xff09…...

【Linux】进程间通信、匿名管道、进程池

一.什么是通信 进程间通信(Inter-Process Communication,IPC),是指在操作系统中,不同进程之间进行数据交换和同步的机制。由于每个进程通常拥有独立的内存空间,进程间无法直接访问对方的内存,因此需要通过特定的机制来实现通信和…...

【Block总结】PlainUSR的局部注意力,即插即用|ACCV2024

论文信息 标题: PlainUSR: Chasing Faster ConvNet for Efficient Super-Resolution作者: Yan Wang, Yusen Li, Gang Wang, Xiaoguang Liu发表时间: 2024年会议/期刊: 亚洲计算机视觉会议(ACCV 2024)研究背景: 超分辨率(Super-Resolution, S…...

35信号和槽_信号槽小结

Qt 信号槽 1.信号槽是啥~~ 尤其是和 Linux 中的信号进行了对比(三要素) 1) 信号源 2) 信号的类型 3)信号的处理方式 2.信号槽 使用 connect 3.如何查阅文档. 一个控件,内置了哪些信号,信号都是何时触发 一…...

现代复古电影海报品牌徽标设计衬线英文字体安装包 Thick – Retro Vintage Cinematic Font

Thick 是一种大胆的复古字体,专为有影响力的标题和怀旧的视觉效果而设计。其厚实的字体、复古魅力和电影风格使其成为电影海报、产品标签、活动品牌和编辑设计的理想选择。无论您是在引导电影的黄金时代,还是在现代布局中注入复古活力,Thick …...

低代码开发平台:飞帆画 echarts 柱状图

https://fvi.cn/711 柱状图这个控件是由折线图的控件改过来的,在配置中,单选框选择柱状图就行了。...

Linux中C++ gdb调试命令

编译可执行文件需要带上-g选项参数 输入回车则重复执行上一次命令; 进入gdb: gdb 程序名运行gdb命令: r打断点命令: b 行号查看断点命令: i b打印变量命令: p 变量名持续查看变量命令: d…...

Python精进系列:从 __name__ 开始了解 python 常见内置变量

目录 引言一、__name__是什么?案例1:直接运行模块案例2:模块被导入 二、__name__的主要用途(一)区分主程序和导入模块案例3:测试代码隔离(二)动态导入模块案例4:根据环境…...

Nacos 服务发现的核心模型有哪些?Service, Instance, Cluster 之间的关系是什么?

Nacos 服务发现的核心模型 Nacos 服务发现的核心数据模型主要围绕以下几个关键概念构建,它们共同构成了服务注册与发现的基础: Namespace (命名空间): 用途: 用于进行环境隔离。比如,你可以为开发环境 (dev)、测试环境 (test) 和生产环境 (p…...

Java程序设计第1章:概述

一、Hello World 1.代码: public class HelloWorld {public static void main(String[] args){System.out.println("Hello World!");} } 2.运行结果: Hello World! 二、输出姓名、学号、班级 1.题目: 编写一个Application&a…...

C++开发工具全景指南

专业编译与调试工具深度解析 2025年4月 编译器套件 GNU Compiler Collection (GCC) GNU编译器套件是自由软件基金会开发的跨平台编译器系统,支持C、C、Objective-C、Fortran、Ada等多种编程语言。作为Linux系统的标准编译器,GCC以其强大的优化能力和…...

Java的Selenium的特殊元素操作与定位之iframe切换

iframe切换 四种切换方式: driver.switchTo().frame(index);driver.switchTo().frame(id);driver.switchTo().frame(name);driver.switchTo().frame(WebElement); 切换之后,回到默认内容页面(否则会找不到元素 driver.switchTo().defaultContent(); //iframe处…...

AI比人脑更强,因为被植入思维模型【42】思维投影思维模型

giszz的理解:本质和外在。我们的行为举止,都是我们的内心的表现。从外边可以看内心,从内心可以判断外在。曾国藩有7个识人的方法,大部分的人在他的面前如同没穿衣服一样。对于我们自身的启迪,我认为有四点&…...

7-12 最长对称子串(PTA)

对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。 输入格式: 输入在一行中给出长度不超过1000的非空字符串。 输出格式&…...

嵌入式AI的本地化部署的好处

嵌入式AI本地化处理(即边缘计算)的核心优势在于将AI算力下沉至设备端,直接处理数据而非依赖云端,这种模式在多个维度上展现出显著价值: 一、数据隐私与安全性提升 1. 敏感数据本地存储 金融、医疗等涉及隐私的行业…...

0基础 | 硬件 | 电源系统 一

降压电路LDO 几乎所有LDO都是基于此拓扑结构 图 拓扑结构 LDO属于线性电源,通过控制开关管的导通程度实现稳压,输出纹波小,无开关噪声 线性电源,IoutIin,发热功率P电压差△U*电流I,转换效率Vo/Vi LDO不适…...

LeetCode详解之如何一步步优化到最佳解法:20. 有效的括号

LeetCode详解系列的总目录(持续更新中): LeetCode详解之如何一步步优化到最佳解法:前100题目录(更新中...)-CSDN博客 LeetCode详解系列的上一题链接: LeetCode详解之如何一步步优化到最佳解法…...

LeetCode18四数之和

代码来源:代码随想录 /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ int com…...

《K230 从熟悉到...》无线网络

《K230 从熟悉到...》无线网络 STA模式 《庐山派 K230 从熟悉到...》无线网络 无线网络中通常是STA(Station,站点)和AP(Access Point,无线接入点)。 STA(站点) 定义:STA…...

去中心化指数(链上ETF)

去中心化指数(链上ETF) 核心概念 去中心化指数: 类似传统金融的ETF(交易所交易基金),通过一篮子代币分散投资风险,无需主动管理。 核心价值:降低研究成本、分散风险、自动化资产…...

LeeCode题库第1695题

项目场景: 给你一个正整数数组 nums ,请你从中删除一个含有 若干不同元素 的子数组。删除子数组的 得分 就是子数组各元素之 和 。 返回 只删除一个 子数组可获得的 最大得分 。 如果数组 b 是数组 a 的一个连续子序列,即如果它等于 a[l],…...

【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)

🚀 LeetCode 热题 23:合并 K 个升序链表(详细解析) 📌 题目描述 LeetCode 23. Merge k Sorted Lists 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合…...

LeetCode hot 100—删除链表的倒数第N个节点

题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&…...

超级科学软件实验室(中国) : Super Scientific Software Laboratory (SSSLab)

Super Scientific Software Laboratory (SSSLab) gitee 官网...

2025大唐杯仿真1——车联网

车联网 V2N是指车辆与网络 Uu接口是用户设备(UE)与基站之间的通信接口,用于终端和基站之间的通信 Uu接口可用的是N41频段,归属中国移动 车辆间交互是V2V,频段是PCS PC5接口是一种用于设备间直接通信(D2D…...

云资源合规基线:确保云环境安全与合规的完整指南

1. 引言 随着越来越多的企业将其IT基础设施迁移到云端,确保云资源的安全性和合规性变得至关重要。云资源合规基线是一套最佳实践和标准,旨在帮助组织维护安全、高效且符合法规要求的云环境。本文将深入探讨云资源合规基线的各个方面,为IT管理者和安全专业人士提供全面的指导。…...

1.0 软件测试全流程解析:从计划到总结的完整指南

软件测试全流程解析:从计划到总结的完整指南 摘要 本文档详细介绍了软件测试的完整流程,包括测试计划、测试设计、测试执行、测试报告和测试总结等主要阶段。每个阶段都从目标、主要工作、输出物和注意事项等方面进行了详细说明。通过本文档&#xff0…...

@reduxjs/toolkit 报错,解决

项目场景: 使用redux存储状态,写一个reducer 问题描述 报错:Uncaught Error: A case reducer on a non-draftable value must not return undefined import { createSlice } from "reduxjs/toolkit"; //错误写法 const counterS…...

C++蓝桥杯实训篇(二)

片头 嗨咯~小伙伴们!今天我们来一起学习算法和贪心思维,准备好了吗?咱们开始咯! 第1题 数位排序 对于这道题,我们需要自己写一个排序算法,也就是自定义排序,按照数位从小到大进行排序。 举一…...

YY forget password

YY forget password 老早以前的语音工具,游戏团队协作工具...

Kafka 如何解决消息堆积问题?

Kafka 的消息堆积问题是实际生产中经常遇到的情况,尤其在高并发、大流量、消费者故障或处理速度慢的情况下,非常容易出现。 下面我从诊断 解决方案 实战技巧三步帮你梳理清楚: 🔍 一、先判断:是否真的“堆积”&…...

如何通过优化HMI设计大幅提升产品竞争力?

一、HMI设计的重要性与竞争力提升 HMI(人机交互界面)设计在现代产品开发中扮演着至关重要的角色。良好的HMI设计不仅能够提升用户体验,还能显著增强产品的竞争力。在功能趋同的市场环境中,用户体验成为产品竞争的关键。HMI设计通…...

2025大唐杯仿真4——信令流程

Preamble请求...

MyBatis Plus 在 ZKmall开源商城持久层的优化实践

ZKmall开源商城作为基于 Spring Cloud 的高性能电商平台,其持久层通过 MyBatis Plus 实现了多项深度优化,涵盖分库分表、缓存策略、分页性能、多租户隔离等核心场景。以下是具体实践总结: 一、分库分表与插件集成优化 1. 分库分表策略 ​Sh…...

Qt多线程从基础到性能优化

一、为什么需要多线程开发 现代应用程序的性能需求 CPU多核架构的有效利用 复杂任务的解耦与响应式界面保持 二、Qt线程创建四大方式 1. 继承QThread重写run() class WorkerThread : public QThread {void run() override {// 耗时操作qDebug() << "Thread ID…...

Spring常见问题复习

############Spring############# Bean的生命周期是什么&#xff1f; BeanFactory和FactoryBean的区别&#xff1f; ApplicationContext和BeanFactory的区别&#xff1f; BeanFactoryAware注解&#xff0c;还有什么其它的Aware注解 BeanFactoryAware方法和Bean注解的方法执行顺…...

股票日数据使用_未复权日数据生成前复权日周月季年数据

目录 前置&#xff1a; 准备 代码&#xff1a;数据库交互部分 代码&#xff1a;生成前复权 日、周、月、季、年数据 前置&#xff1a; 1 未复权日数据获取&#xff0c;请查看 https://blog.csdn.net/m0_37967652/article/details/146435589 数据库使用PostgreSQL。更新日…...

【C++】从零实现Json-Rpc框架(2)

目录 JsonCpp库 1.1- Json数据格式 1.2 - JsonCpp介绍 • 序列化接口 • 反序列化接口 1.3 - Json序列化实践 JsonCpp使用 Muduo库 2.1 - Muduo库是什么 2.2 - Muduo库常见接口介绍 TcpServer类基础介绍 EventLoop类基础介绍 TcpConnection类基础介绍 TcpClient…...

JVM虚拟机篇(二):深入剖析Java与元空间(MetaSpace)

这里写目录标题 JVM虚拟机篇&#xff08;二&#xff09;&#xff1a;深入剖析Java与元空间&#xff08;MetaSpace&#xff09;一、引言二、全面认识Java2.1 Java的起源与发展历程2.2 Java的特性2.2.1 简单性2.2.2 面向对象2.2.3 平台无关性2.2.4 健壮性2.2.5 安全性2.2.6 多线程…...

NDK开发:音视频处理基础

音视频处理基础 一、音视频基础 1.1 音视频基本概念 视频编码格式 H.264/AVCH.265/HEVCVP8/VP9AV1音频编码格式 AACMP3PCMOPUS封装格式 MP4FLVMKVTS1.2 音视频处理流程 视频处理流程 采集(Camera/Screen)预处理(美颜/滤镜)编码(H.264/H.265)封装传输/存储音频处理流程 …...

【数字电路】第一章 数制和码制

一、数码的基本概念 1.数制 2.码制 二、几种常用的数制 三、不同数制间的转换 八进制和十六进制间通常不直接进行转换&#xff0c;而是先转换成二进制或十进制然后再进行转换。 1.任意进制→十进制&#xff08;N—十转换&#xff09; 2.十进制→任意进制&#xff08;十—N转换…...

软件工程面试题(二十九)

1、Internet的最顶级的商业域名叫什么? 答: .com 2、GC是什么,为什么要使用它? 垃圾回收 (garbage collection, GC) 一个跟踪过程,它传递性地跟踪指向当前使用的对象的所有指针,以便找到可以引用的所有对象,然后重新使用在此跟踪过程中未找到的任何堆内存。公共语言运行…...

6.第二阶段x64游戏实战-分析人物状态

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;5.第二阶段x64游戏实战-动态模块地址 人物状态是与角色相关的&#xff0c;如果…...

Synopsys:设计对象

相关阅读 Synopsyshttps://blog.csdn.net/weixin_45791458/category_12812219.html?spm1001.2014.3001.5482 对于Synopsys的EDA工具&#xff08;如Design Compiler、PrimeTime、IC Compiler&#xff09;等&#xff0c;设计对象(Design Objects)是组成整个设计的抽象表示&…...

Redis数据结构之Hash

目录 1.概述2.常见操作2.1 H(M)SET/H(M)GET2.2 HGETALL2.3 HDEL2.4 HLEN2.5 HEXISTS2.6 HKEYS/HVALS2.7 HINCRBY2.8 HSETNX 3.总结 1.概述 Hash是一个String类型的field(字段)和value(值)的映射表&#xff0c;而且value是一个键值对集合&#xff0c;类似Map<String, Map<…...

【VUE】RuoYi-Vue3项目结构的分析

【VUE】RuoYi-Vue3项目结构的分析 1. 项目地址2. RuoYi-Vue3项目结构2.1 整体结构2.2 package.json2.2.1 &#x1f9fe; 基本信息2.2.2 &#x1f527; 脚本命令&#xff08;scripts&#xff09;2.2.3 &#x1f30d; 仓库信息2.2.4 &#x1f4e6; 项目依赖&#xff08;dependenc…...