【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)
目录
- 1. 什么是事务?
- 2. 事务的版本支持
- 3. 事务提交的方式
- 3.1 事务提交方式的分类
- 3.2 演示的准备的工作
- 3.2.1 创建表
- 3.2.2 MySQL的服务端和客户端
- 3.2.3 调低事务的隔离级别
- 4. 手动提交
- 4.1 手动提交的命令说明
- 4.2 示例一
- 4.3 示例二
- 4.4 示例三
- 4.5 示例四
- 5. 自动提交
- 5.1 开启自动提交
- 5.2 关闭自动提交
- 6. 手动提交和自动提交的关系
1. 什么是事务?
举一个抢火车票的例子:
场景一:
当火车票还剩下一张,三个人同时抢票,客户端1强到票了(数据库中的票数变为0),当客户端1进行付钱时突然系统崩溃了,客户端1再次进入到付钱的页面时付钱的时间已经结束了,但是票没有恢复到数据库中,数据库中的票数一直显示为0,系统崩溃一次导致一张车票消失了,三个人都买不了票了。
场景二:
当火车票还剩下一张,三个人同时抢票,客户端1强到票了(数据库中的票数变为没有变为0),当客户端1进行付钱时网络不好,此时客户端2抢到了票并付了钱,此时的数据库票数为0,但是客户端2的网络变好后在付款界面付了钱。这张票算谁的呢?
CURD满足什么属性,能解决上述问题?
- 买票的过程是一个单独的整体
- 个人买票的时候不能收其他人影响
- 买完票应该要永久有效
- 买前,和买后都要是确定的状态
什么是事务?
事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。
事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。假设一种场景:你正在注册一个银行账户,你需要在一个页面填入你的姓名、年龄、性别、身份证号等等,在数据库后台中,就需要多条MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。
正如我们上面所说,一个MySQL 数据库,可不止你一个事务在运行,同一时刻,甚至有大量的请求被包
装成事务,在向MySQL 服务器发起事务处理请求。而每条事务至少一条SQL ,最多很多SQL ,这样如果大
家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。
甚至,因为事务由多条SQL 构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?
所有,一个完整的事务,绝对不是简单的sql 集合,还需要满足如下四个属性:
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中
间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个
事务从来没有执行过一样。 - 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完
全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工
作。 - 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力隔离性可以防止多个事务
并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(read uncommitted )、读提交(read committed)、可重复读(erializable )、(repeatable read)和串行化 - 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
为什么会出现事务 ?
事务被MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程,不需要我们去考虑各种各样的潜在错误和并发问题。可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?
因此事务本质上是为了应用层服务的,而不是伴随着数据库系统天生就有的。
备注:我们后面把MySQL 中的一行信息,称为一行记录
2. 事务的版本支持
在 MySQL 中只有使用了 InnoDB 数据库引擎的数据库或表才支持事务,MyISAM不支持事务。
查看数据看引擎:
# 查看数据库引擎,以表格的方式显示
show engines; # 查看数据库引擎,以行的方式显示
show engines\G
以表格的方式显示:
3. 事务提交的方式
3.1 事务提交方式的分类
- 按照提交机制分类
- 显式提交:用户或应用程序显式地发出提交命令(如SQL语句COMMIT;),以结束事务并使事务所做的更改成为永久性的。
- 隐式提交:数据库系统在满足某些条件时自动提交事务。例如,在执行某些DDL(数据定义语言)语句(如CREATE TABLE, ALTER TABLE等)之后,数据库可能会自动提交当前事务。
- 按照事务控制方式分类
- 自动提交(Auto-commit):在自动提交模式下,每个单独的SQL语句都被视为一个独立的事务,执行完后会立即提交。这意味着每个SQL语句都会立即生效,无需显式地开始和结束事务。自动提交模式适合于那些不需要将多个操作组合成单个事务的情况,例如简单的查询和插入操作
- 手动提交(Manual commit):手动提交模式要求应用程序显式地开始和结束事务。在这种模式下,用户需要使用BEGIN TRANSACTION;(或类似的命令)开始事务,使用COMMIT;提交事务,或使用ROLLBACK;回滚事务。这种方式提供了更大的灵活性,适用于需要将多个操作组合成一个逻辑单元的情况,确保这些操作要么全部成功,要么全部失败。
同学们可能此时有点晕,不用着急,经过下面的例子后思路会慢慢清晰。
3.2 演示的准备的工作
3.2.1 创建表
创建一个表:
create table students(id int primary key,name varchar(10),age tinyint(1)) engine = innodb;
3.2.2 MySQL的服务端和客户端
模拟多个用户同时访问数据库,这里我用两个命令行客户端与服务端建立连接。
MySQL由服务端(Server)和客户端(Client)两部分组成,这两者通过网络进行通信,共同完成数据库的各种操作。
建立连接:
客户端向服务端发起连接请求,指定服务端的 IP 地址和端口号。
服务端接收到请求后,进行身份验证,验证通过后建立连接。
发送请求:
客户端发送 SQL 语句或其他命令到服务端。
服务端解析收到的请求,执行相应的操作。
给同学们看看MySQL的客户端和服务端在哪:
命令:
# 查看MySQL客户端
ls /usr/bin/mysql# 查看MySQL服务端
ls /usr/sbin/mysqld
以上我们可知,MySQL其实是一套网络服务,底层采用tcp协议
MySQL是一套网络服务,那么就相当于一个远程的服务器
我们可以使用很多台远端机器连接正在运行着的MySQL服务器。
比如,你同学的电脑上运行着MySQL,你可以使用自己的电脑连接他的MySQL进行操作。
这次示例中我用两个客户端连接一台MySQL服务器:
左侧位客户端1,右侧为客户端2.
3.2.3 调低事务的隔离级别
默认的隔离级别太高了,我们是为了研究事务,研究事务就要研究多个客户端并发的现象。把隔离级别调成最低,在一个客户端更改数据后,在另一个客户端就能观察到现象。这样能很清楚的看到双方的事务在交叉时带来的问题。
为什么要修改隔离级别的具体原因暂时不讲,当学到事务隔离级别的时候自然会明白。
修改隔离级别为 读不提交(read uncommit):
set global transaction isolation level read uncommmitted;
创建隔离级别后重新登陆客户端1和客户端2。
查询隔离级别:
select @@tx_isolation;
查看客户端的登录状态
show processlist;
此时用两个客户端在登录。
4. 手动提交
4.1 手动提交的命令说明
-
开始事务:
# 命令1 start transaction;#命令2 begin;
开始一个新的事务。在执行这条命令之前,如果有未提交的事务,MySQL 会自动提交当前事务。
-
提交事务(commit)
commit;
提交当前事务,将所有对数据库的更改永久保存。
-
保存点(savepoint)
savepoint savepoint_name;
在事务中设置一个保存点。保存点可以让你在事务中部分回滚到某个点,而不是回滚整个事务。
-
回滚事务(rollback)
# 回滚到事务开始 rollback;# 回滚到某一点 rollback to savepoint_name;
回滚当前事务,撤销所有对数据库的更改。
-
撤销保存点
RELEASE SAVEPOINT savepoint_name;
释放指定的保存点。一旦释放,就不能再回滚到该保存点。
4.2 示例一
场景一:
开始事务,
执行命令,创建节点,
执行命令,创建节点,
rollback to 回滚到某一保存点
提交事务
示例:
-
在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据
# 客户端1 insert into students values(1, '李明', 18); # 创建保存点 savepoint p1;# 客户端2 select * from students;
当一个客户端操作数据后,在另一个客户端可以立即看到。
-
在客户端1插入数据,创建保存点;然后在客户端2查询数据
# 客户端1 insert into students values(2, '诸葛亮', 20); # 创建保存点 savepoint p2;# 客户端2 select * from students;
-
在客户端1回滚到保存点p2;然后在另一个客户端查询数据
# 客户端1 rollback to p1;# 客户端2 select * from students;
同学们可以发现,查询出的数据变少了,在p1
以下执行的命令被撤销了。 -
在客户端1提交事务;然后在客户端2查询数据
# 客户端1 commit;# 客户端2 select * from students;
同学们可以发现,当客户端1提交事务后,客户端2查询的数据没有发生改变,当客户端2提交事务后,查询的数据还是没发生改变。
总之,事务是单个命令的的集合体;回滚到某一保存点时保留该保存点以上的数据,撤销该保存点以下的数据;提交事务后,对数据的改变已做永久性保存。
4.3 示例二
场景二:
开始事务,
执行命令,创建节点,
执行命令,创建节点,
rollback;
提交事务
-
在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据
# 客户端1 insert into students values(3, '李刚', 18); # 创建保存点 savepoint p1;# 客户端2 select * from students;
-
在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据
# 客户端1 insert into students values(4, '白居易', 19); # 创建保存点 savepoint p2;# 客户端2 select * from students;
-
在客户端1回滚;然后在客户端2查询数据
# 客户端1 rollback;# 客户端2 select * from students;
同学们可以发现,使用rolback;
命令直接回滚到事务开始出,撤销所有的事务操作。
那么,提交事务后仍然是这样吗?
答:是的,回滚后撤销的操作不可以恢复。
# 客户端1
commit;# 客户端2
select * from students;
4.4 示例三
场景三:
开始事务,
执行命令,创建节点,
执行命令,创建节点,
提交事务
rollback;
-
在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据
# 客户端1 insert into students values(3, '李刚', 18); # 创建保存点 savepoint p1;# 客户端2 select * from students;
-
在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据
# 客户端1 insert into students values(4, '白居易', 19); # 创建保存点 savepoint p2;# 客户端2 select * from students;
-
在客户端1提交事务;然后在客户端2查询数据
# 客户端1 commit;# 客户端2 select * from students;
-
在客户端1回滚;然后在客户端2查询数据
# 客户端1 rollback;# 客户端2 select * from students;
同学们可以发现,提交事务后再回滚是没有作用的,提交事务后,对数据的改变已做永久性保存。
4.5 示例四
场景四:
开始事务,
执行命令,创建节点,
执行命令,创建节点,
客户端崩溃(CTRL + D
模拟崩溃)
-
在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据
# 客户端1 insert into students values(5, '李世民', 19); # 创建保存点 savepoint p1;# 客户端2 select * from students;
-
在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据
# 客户端1 insert into students values(6, '程咬金', 20); # 创建保存点 savepoint p2;# 客户端2 select * from students;
-
在客户端1模拟崩溃;然后在客户端2查询数据
# 客户端1 `CRRL + D`# 客户端2 select * from students;
步骤3模拟的是客户1端崩溃,同学们可以发现,当客户端1在事务中崩溃后,客户端2查询不到该事务操作的数据。也就是说,当客户端在事务操作中崩溃后,会撤销该事务的所有操作,即回滚到该事务的开始。
5. 自动提交
5.1 开启自动提交
自动提交不需要任何的手动,最开始学习时写的SQL命令就是自动提交的。当我们不手动写begin/commit
时,写的每一个SQL命令也都是事务,只不过写什么就提交什么。
-
开启自动提交(MySQL数据库默认开启)
set autocommit = 1;
-
查询自动提交是否开启
select @@autocommit;
1
表示开启,0
表示关闭。
示例:
-
客户端1正常的往表格中插入数据,然后客户端2查询数据
# 客户端1 insert into students values(1,'李明', 18);# 客户端2 select * from students;
当你正常使用 MySQL 并且不手动使用事务时,MySQL 会默认处于自动提交模式。这意味着每个单独的 SQL 语句都会立即提交,而不是等待显式的提交命令。 -
客户端1正常的往表格中插入数据,然后客户端2查询数据,当客户端1崩溃后,客户端再次查询数据
# 客户端1 insert into students values(5,'李世民', 19);# 客户端2 select * from students; # 客户端1,模拟崩溃 `CTRL + D`
我们可以发现,使用自动提交的时候,当客户端1崩溃后,进行操作的数据是不会丢失的,在客户端2依然能查询到已经操作的数据。
5.2 关闭自动提交
当关闭自动提交(autocommit)后,你需要显式地使用 COMMIT 命令来提交事务。这样可以确保你的更改被永久保存到数据库中。如果没有显式地提交事务,那么在事务中的所有更改都不会被保存,直到你显式地提交或回滚事务。
-
关闭自动提交(MySQL数据库默认开启)
set autocommit = 0;
-
查询自动提交是否开启
select @@autocommit;
示例:
客户端1正常的往表格中插入数据,然后客户端2查询数据
# 客户端1
insert into students values(6,'程咬金', 20);# 客户端2
select * from students;
此时插入的数据在客户端2可以查询到,但是真的是永久保存下来了吗?
答:不是
模拟客户端1崩溃,然后用客户端2查询
# 客户端1
`CTRL + D`# 客户端2
select * from students;
同学们可以发现,当客户端1崩溃后,在客户端2就查询不到操作的数据了。
这是因为关闭自动提交后,每次的操作都不会是永久的保存,只用使用commit
才可以永久的保存下来。
插入刚才没有成功插入的数据:
# 客户端1
insert into students values(6,'程咬金', 20);
commit;
`CTRL + D`# 客户端2
select * from students;
当客户端1插入数据后并执行commit
后,客户端1崩溃,但是在客户端2依然可以查询到插入的操作。事务提交commit
让数据永久的保存了下来。
6. 手动提交和自动提交的关系
我在演示手动提交的实验时开启了自动提交,
但是,
自动提交 autocommit=1/0
不会影响手动事务提交(begin/commit),自动提交 与 手动事务提交没有任何关系。
换言之:
如果不手动使用begin,当autocommit=1时自动提交就会起作用,执行一个语句就会提交;当autocommit=0时自动提交就会关闭,执行一个语句需要显示提交,使用commit提交事务。
如果手动使用begin,自动提交就会不起作用,当执行命令begin时,未手动执行commit之前,事务就不会提交。
总之,系统遵循手动优先,自动为辅。
当设置 set autocommit = 0
,重复上述手动事务的实验,可以发现实验结果和autocommit=1
的结果完全一致。
那么autocommit
开启和关闭作用是什么呢?
答:当关闭autocommit时,执行命令后必须显示使用commit提交,否则操作的数据不会永久性保存到数据库,即当客户崩溃后之前执行的所有命令都会失效;当开启autocommit时,执行命令后不必手动commit,因为每当执行命令后都会默认自动提交事务。
其实,我们执行的所有命令(包括不使用begin/commit的命令)都是事务,人为创建的事务需要使用命令begin/commit,平常的命令只不过没有显示出命令begin/commit,但也是事务。
总结:
系统遵循手动优先,自动为辅。自动提交执行的前提条件是没有手动执行事务的开始。
相关文章:

【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)
目录 1. 什么是事务?2. 事务的版本支持3. 事务提交的方式3.1 事务提交方式的分类3.2 演示的准备的工作3.2.1 创建表3.2.2 MySQL的服务端和客户端3.2.3 调低事务的隔离级别 4. 手动提交4.1 手动提交的命令说明4.2 示例一4.3 示例二4.4 示例三4.5 示例四 5. 自动提交5…...

CUDA 核心与科学计算 :NVIDIA 计算核心在计算服务器的价值
在现代科学计算领域,NVIDIA GPU 的计算能力是突破研究瓶颈的关键力量,而其中的 CUDA 核心与科学计算有着紧密的联系。 CUDA 核心于 2007 年开发,是一款基于单指令多线程 (SIMT) 模型的多功能通用核心。它在处理并行计算任务方面能力卓越&…...
架构师之路-学渣到学霸历程-58
Nginx的反向代理实验 今天分享的实验其实就是一个变形;变形uri看看nginx的配置有什么区别; 这个就更加绕,是比较不同的配置路径会有什么的区别? 来看看这个变形会得出什么的效果 1.首先配置后端服务器的资源 首页资源–>1…...
qq相册为啥越来越糊
电子存储衰退的原因 存储设备的失真通常和 存储介质的老化、数据退化、电荷泄漏 等问题有关。尤其是对闪存类存储(如SSD、U盘)来说,随着时间的推移,存储在其中的电荷可能会流失,导致数据损坏。而对于传统的机械硬盘&am…...

<有毒?!> 诺顿检测:这篇 CSDN 文章有病毒
NAS(qnap)中安装git服务(gogs),硬件为TS-453Bmini,固件版本:QTS 5.1.2.2533_qnap git服务器-CSDN博客 https://estar.blog.csdn.net/article/details/134138932 威胁名称:JS:Downloader-GEG [Trj]威胁类型:特洛伊木马…...

matlab实现主成分分析方法图像压缩和传输重建
原创 风一样的航哥 航哥小站 2024年11月12日 15:23 江苏 为了研究图像的渐进式传输技术,前文提到过小波变换,但是发现小波变换非常适合传输缩略图,实现渐进式传输每次传输的数据量不一样,这是因为每次变换之后低频成分大约是上一…...

18.UE5怪物视野、AI感知、攻击范围、散弹技能
2-20 怪物视野、AI感知、攻击范围、散弹技能_哔哩哔哩_bilibili 目录 1.AI感知组件 2.AI感知更新的函数 3.攻击范围 4.散弹技能 4.1创建发射物i 4.2创建远程攻击方式 4.3散弹自定义事件的实现 4.4动画通知实现攻击 1.AI感知组件 为怪物蓝图添加AI感知组件,…...

【 ElementUI 组件Steps 步骤条使用新手详细教程】
本文介绍如何使用 ElementUI 组件库中的步骤条组件完成分步表单设计。 效果图: 基础用法 简单的步骤条。 设置 active 属性,接受一个 Number,表明步骤的 index,从 0 开始。 需要定宽的步骤条时,设置 space 属性即…...
MQTT从入门到精通之 MQTT 客户端编程
MQTT 客户端编程 1 在VUE中使用MQTT 具体步骤如下所示: 1、初始化vue项目 // 创建一个使用vite构建的前端项目 npm create vitelatest// 进入到项目中,执行如下命令安装项目依赖 npm install 2、安装element plus // 安装element plus npm install …...

数据结构-集合
一.集合的表示 一个重要的操作是查某个元素属于哪个集合,另一个操作是合并操作 从这个树的节点去找树根也就是从下往上找,要把树并起来只需把两个根并在一起就可以了 不存在已知一个节点去找孩子节点,根重要的是已知一个节点找它的父亲节点,与之前的二…...

前端 JS面向对象 原型 prototype
目录 一、问题引出 二、prototype原型对象 三、小结 四、constructor 五、__proto__对象原型 六、原型链 一、问题引出 由于JS的构造函数存在内存浪费问题: function Star(name,age){this.namenamethis.ageagethis.singfunction () {console.log("唱歌&…...
Java中的不可变集合:性能与安全并重的最佳实践
Java中的不可变集合:性能与安全并重的最佳实践 在现代软件开发中,集合类(如List、Set和Map)是Java开发者的日常工具。它们用于存储和操作数据,能极大地简化开发工作。但随着并发编程和大规模应用的广泛使用࿰…...
RandomWords随机生成单词
from random_words import RandomWords rw RandomWords() r rw.random_word() print(r) 更多How to use — random_words documentation (randomwords.readthedocs.io) li LoremIpsum()# 这行代码创建了一个 LoremIpsum 类的实例。li.get_sentence()# 这个方法返回一个随机…...

从零开始使用Intel的AIPC使用xpu加速comfyui
Intel的AIPC使用xpu加速跑comfyui 环境安装python环境搭建驱动及oneAPI安装创建python环境验证环境是否生效 ComfyUI的安装下载、汉化comfyui下载checkpoint 测试使用xpu加速测试使用cpu执行测试 环境安装 python环境搭建 直接下载Anaconda 下载地址 安装好后,通…...
PyQt入门指南五十二 版本控制与协作开发
在开发PyQt应用程序时,版本控制和协作开发是提高开发效率和项目可维护性的重要手段。本指南将介绍如何使用Git进行版本控制,以及如何使用GitHub进行协作开发。 版本控制基础 Git简介:Git是一种分布式版本控制系统,用于跟踪代码变…...

思考:linux Vi Vim 编辑器的简明原理,与快速用法之《 7 字真言 》@ “鱼爱返 说 温泉啊“ (**)
Linux vi/vim | 菜鸟教程 https://zhuanlan.zhihu.com/p/602675406 Linux Vim编辑器的基本使用_vim文本编辑器-CSDN博客 这里提出使用 vi / vim 进行简单的编辑操作的原因,主要是在容器镜像中,普遍都是使用这个。 在 linux 服务器应用场景&#x…...

共筑开源技术新篇章 | 2024 CCF中国开源大会盛大开幕
在这个技术革新日新月异的时代,开源精神如同点燃创新火焰的火种,照亮了无数技术探索者的征途。2024年11月9日,备受瞩目的2024 CCF中国开源大会在深圳这座充满活力的创新之城盛大开幕。这场开源领域的顶级盛事,以“湾区聚力 开源启…...

SpringBoot(十八)SpringBoot集成Minio
项目上传文件集成一下Minio,下面是我在项目中集成Minio的全过程。 首先介绍一下Minio:MinIO是高性能的对象存储,单个对象最大可达5TB。适合存储图片、视频、文档、备份数据、安装包等一系列文件。是一款主要采用Golang语言实现发开的高性能、分布式的对象存储系统。客户端支…...

ODOO学习笔记(3):Odoo和Django的区别是什么?
Odoo和Django都是基于Python的开源框架,但它们的设计目标和用途有所不同: 设计目标和用途: Odoo:Odoo是一个企业资源规划(ERP)系统,它提供了一套完整的商业管理软件,包括会计、库存…...

持续收集解决VCcode各种报错的方法
在学习中我们经常会发生各种各样的报错, 1、pip 安装失败的报错 类似下面的 我们有时候纠结在上面会纠结好久,浪费很多时间。(什么轮子我不知道) 常见的解决方法: s-1:先uninstall packing,再重新装一次(有时候会重…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...