深入理解MySQL事务(万字详)
文章目录
- 什么是事务
- 为什么会出现事务
- 事务的版本支持
- 事务的提交方式
- 事务常见操作方式
- 正常演示 - 证明事务的开始与回滚
- 非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)
- 非正常演示2 - 证明commit了,客户端崩溃,MySQL数据不会在受影响,已经持久化
- 非正常演示3 - 对比试验。begin会自动更改提交方式
- 非正常演示4 - 证明单条 SQL 与事务的关系
- 事务的隔离级别
- 查看与设置隔离性
- 读未提交(Read Uncommitted)
- 读提交(Read Committed)
- 可重复读(Repeatable Read)
- 串行化(Serializable)
- 一致性
- 多版本并发控制MVCC
- 3个记录隐藏列字段
- undo日志
- 快照
- Read View
什么是事务
首先,我们知道MySQL是一定会在同时被多个用户访问的,那么就会发送下面这种情况
上述情况就会导致,同一张票被出售两次,显然不合理;
那么我们应该如何做,才可以避免上述情况呢?当满足下列条件时,即可避免
- 买票的过程是原子的
我买票的时候别人不能影响我
- 买票的过程不能互相影响
我正在买的时候,你来买了
- 买完票应该是永久的
我买完票,交完钱了,你不能不给我票,直接扣我的钱,而什么也不给我,即不给票也不还钱
- 买前,买后状态是确定的
买前、买后、买成功、买失败,不能模棱两可,一定是确定的,成不成功并不重要
那么到底什么是事务呢???
事务是一组逻辑上相关的数据库操作(DML语句),这些操作要么全部成功,要么全部失败。事务的主要目的是确保数据的完整性和一致性。例如,在一个银行转账系统中,转账操作需要同时更新两个账户的余额,这两个操作必须作为一个整体执行,否则会导致数据不一致。
- 我对我的账号
+100
; - 我对你的账号
-100
;
单独的一条SQL并没有实际意义
一个 MySQL 数据库,可不止你一个事务在运行,同一时刻,甚至有大量的请求被包
装成事务,在向 MySQL 服务器发起事务处理请求。而每条事务至少一条 SQL ,最多很多 SQL ,这样如果大家都访问同样的表数据,在不加保护的情况,就绝对会出现问题
所以,一个完整的事务,绝对不是简单的 sql 集合,还需要满足如下四个属性,通常称为ACID属性:
-
原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败。如果事务在执行过程中发生错误,系统会回滚到事务开始前的状态
-
一致性(Consistency):事务执行前后,数据库必须保持一致状态。这意味着事务执行后,数据库必须满足所有的完整性约束
-
隔离性(Isolation):多个事务并发执行时,每个事务的操作应该与其他事务隔离,防止数据不一致。MySQL提供了不同的隔离级别来控制事务的隔离程度,包括读未提交( Readuncommitted )、读提交( read committed )、可重复读( repeatable read )和串行化( Serializable )
-
持久性(Durability):一旦事务提交,对数据的修改就是永久的,即使系统发生故障也不会丢失
综上,事务就是在ACID
四大属性的加持下,由一条、多条SQL构成的;
事务的本质(白话)是站在MySQL使用者角度,我要完成一个功能(转账),这个功能由多条SQL语句组成;
为什么会出现事务
首先,事务被 MySQL 编写者设计出来;
本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程模型,
不需要我们去考虑各种各样的潜在错误和并发问题。
因此事务本质上是为了应用层服务的
,而不是伴随着数据库系统天生就有的。
事务的版本支持
首先,在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM 不支持。
我们可以通过以下SQL来查询
- Engine: 表示存储引擎的名称
- Support: 表示服务器对存储引擎的支持级别,YES表示支持,NO表示不支持,DEFAULT表示数据库默认使用的存储引擎,DISABLED表示支持引擎但已将其禁用
- Comment: 表示存储引擎的简要说明
- Transactions: 表示存储引擎是否支持事务,可以看到InnoDB存储引擎支持事务,而MyISAM存储引擎不支持事务
- XA: 表示存储引擎是否支持XA事务
- Savepoints: 表示存储引擎是否支持保存点
事务的提交方式
事务的提交方式常见的有两种:
- 自动提交
- 手动提交
我们可以用下面SQL来查询当前的提交方式
此时Value的值为ON表示自动提交
用 SET 来改变 MySQL 的自动提交模式:
将autocommit的值设置为1表示打开自动提交,设置为0表示关闭自动提交
事务常见操作方式
正常演示 - 证明事务的开始与回滚
提前准备
为了便于演示,我们将MySQL的隔离级别设置的比较低,即成读未提交
现象如下
创建测试表,简单银行用户表
启动一个事务,一旦启动后,之后的所有SQL都属于同一个事务
两种启动事务的方式
设置savapoint s1
并插入一条数据
设置savapoint s2
并插入一条数据
设置savapoint s3
并插入一条数据
回滚事务
回滚到s3时,s3后面的SQL就没有了;
回滚到s1时,s1后面的SQL就没有了;
提交事务
提交事务后就不能回滚了
丢弃整个SQL,直接
rollback;
非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)
事务在提交之前因为某些原因与MySQL断开连接,那么MySQL会自动让事务回滚到最开始,此时事务内容无效;
这也就是ACID中的A属性,原子性
非正常演示2 - 证明commit了,客户端崩溃,MySQL数据不会在受影响,已经持久化
非正常演示3 - 对比试验。begin会自动更改提交方式
查看autocommit的值为ON,表示事务的提交方式是自动提交
事务在提交之前与MySQL断开连接,那么MySQL依旧会自动让事务回滚到最开始;
证明begin操作会自动更改提交方式,不会受MySQL是否自动提交影响
非正常演示4 - 证明单条 SQL 与事务的关系
将autocommit设置为ON,表示事务执行后自动提交
- 查看autocommit的值为ON,表示事务的提交方式是自动提交
- 左终端中直接向表中新插入一条记录,由于隔离级别是读未提交,因此在右终端中肯定能够查询到新插入的这条记录
- 执行单条SQL后不使用commit进行提交,MySQL异常退出,这时右终端仍然可以看到之前新插入的记录了,因为单条SQL在执行后被自动提交持久化了
将autocommit设置为OFF,表示事务执行后需要手动提交
- 设置autocommit的值为OFF,表示事务执行后需要手动提交
- 左终端中直接向表中新插入一条记录,由于隔离级别是读未提交,因此在右终端中肯定能够查询到新插入的这条记录
- 执行单条SQL后不使用commit进行提交,MySQL异常退出,这时右终端看不到之前新插入的记录了,因为单条SQL在执行后异常退出,MySQL断开连接则会自动进行回滚操作
结论:我们之前一直都在使用单SQL事务,只不过autocommit默认是打开的,因此单SQL事务执行后自动就被提交了
事务的隔离级别
举个例子:
你妈妈给你说:你要么别学,要学就学到最好。至于你怎么学,中间有什么困难,你妈妈不关心。那么你的学习,对你妈妈来讲,就是原子的。那么你学习过程中,很容易受别人干扰,此时,就需要将你的学习隔离开,保证你的学习环境是健康的。
- 数据库中,为了保证事务执行过程中尽量不受干扰,就有了一个重要特征:隔离性
- 数据库中,允许事务受不同程度的干扰,就有了一种重要特征:隔离级别
隔离级别
-
读未提交(Read Uncommitted):事务可以读取其他事务未提交的数据,可能会导致脏读、不可重复读和幻读。
-
读已提交(Read Committed):事务只能读取其他事务已提交的数据,避免了脏读,但可能会导致不可重复读和幻读。
-
可重复读(Repeatable Read):MySQL默认的隔离级别,确保同一事务中多次读取同一数据时,结果一致。避免了脏读和不可重复读,但可能会有幻读。
-
串行化(Serializable):最高的隔离级别,强制事务串行执行,避免了脏读、不可重复读和幻读,但性能最差。
查看与设置隔离性
查看隔离级别
- 查看全局的隔离级别
SELECT @@global.transaction_isolation;
- 查看会话隔离级别
SELECT @@session.transaction_isolation;
也可以省略掉session
SELECT @@transaction_isolation;
设置隔离级别
语法:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED
| READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
- 设置会话隔离级别
只会影响当前会话的隔离级别,不会影响全局的,即使新起会话也不会影响
- 设置全局隔离级别
设置全局隔离级别会影响后续的新会话,但当前会话的隔离级别没有发生变化,如果要让当前会话的隔离级别也改变,则需要重启会话
读未提交(Read Uncommitted)
事务A所作的修改在没有提交之前,事务B就已经能够看到了
一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据,这种现象叫做脏读
读提交(Read Committed)
事务A所作的修改在没有提交之前,事务B不能看到
只有当事务A提交后,事务B才能看到修改后的数据
在B事务没有commit之前,执行过程中,两个相同的select查询得到了不同的数据,这种现象叫做不可重复读
不可重复读是个问题吗??
可重复读(Repeatable Read)
A事务修改数据,B事务并不能查到
只有A事务commit后,B事务也查不到
只有当双方都commit后,B事务才可以查到
- 在可重复读隔离级别下,一个事务在执行过程中,相同的select查询得到的是相同的数据,这就是可重复读
- 一个事务在执行过程中,相同的select查询得到了新的数据,如同出现了幻觉,这种现象叫做幻读
串行化(Serializable)
将隔离级别都设置为串行化,双方查询互不影响
此时事务A要删除一个数据,但是阻塞在了这里
但是事务B的查询并不受影响
当事务Bcommit后,离开事务A就恢复,立马执行SQL对表进行修改
- 串行化是事务的最高隔离级别,多个事务同时进行读操作时加的是共享锁,因此可以并发执行读操作,但一旦需要进行写操作,就会进行串行化,效率很低,几乎不会使用
结论:
一致性
多版本并发控制MVCC
数据库的并发场景
- 读-读并发:不存在任何问题,也不需要并发控
- 读-写并发:有线程安全问题,可能会存在事务隔离性问题,可能遇到脏读、幻读、不可重复读
- 写-写并发:有线程安全问题,可能会存在两类更新丢失问题
- 每个事务都有自己的事务ID,ID的大小决定着,事务到来的顺序;
- mysqld可能会在一个时间范围中处理多个事务,事务也有自己的声明周期,mysqld要对多个事务进行管理;
3个记录隐藏列字段
当我们创建下面一个表
该记录不仅包含name和age字段,还包含上述三个隐藏字段
undo日志
MySQL 中的一段内存缓冲区,用来保存日志数据的
- redo log:重做日志,用于MySQL崩溃后进行数据恢复,保证数据的持久性
- bin log:逻辑日志,用于主从数据备份时进行数据同步,保证数据的一致性
- undo log:回滚日志,用于对已经执行的操作进行回滚,保证事务的原子性
快照
现在有一个事务ID为10的事务,要将刚才插入学生表中的记录的学生姓名“张三”改为“李四”
- 事务10,因为要修改,所以要先给该记录加行锁
- 修改前,现将改行记录拷贝到undo log中,所以,undo log中就有了一行副本数据。(原理就是写时拷贝)
- 所以现在 MySQL 中有两行同样的记录。现在修改原始记录中的name,改成 ‘李四’。并且修改原始记录的隐藏字段
DB_TRX_ID
为当前 事务10 的ID, 我们默认从 10 开始,之后递增。而原始记录的回滚指针DB_ROLL_PTR
列,里面写入undo log
中副本数据的地址,从而指向副本记录,既表示我的上一个版本就是它 - 事务10提交,释放锁
又有一个事务11,对student表中记录进行修改(update):将age(28)改成age(38)
- 先给该记录加行锁
- 修改前,现将改行记录拷贝到undo log中,所以,undo log中就又有了一行副本数据。此时,新的副本,我们采用头插方式,插入undo log
- 现在修改原始记录中的age,改成 38。并且修改原始记录的隐藏字段
DB_TRX_ID
为当前 事务11 的ID。而原始记录的回滚指针DB_ROLL_PTR
列,里面写入undo log中副本数据的地址,从而指向副本记录,既表示我的上一个版本就是它 - 事务11提交,释放锁
这样就形成了一个基于历史版本的链表
上面的每个版本,我们可以称之为快照
当前读 、快照读
当前读:读取最新的记录,就叫做当前读。
快照读:读取历史版本,就叫做快照读。
事务在进行增删查改的时候,并不是都需要进行加锁保护:
-
事务对数据进行增删改的时候,操作的都是最新记录,即当前读,需要进行加锁保护
-
事务在进行select查询的时候,既可能是当前读也可能是快照读,如果是当前读,那也需要进行加锁保护,但如果是快照读,那就不需要加锁,因为历史版本不会被修改,也就是可以并发执行,提高了效率,这也就是MVCC的意义
Read View
Read View
就是事务进行 快照读 操作的时候生产的读视图
(Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID
其源码
class ReadView {// 省略...
private:/** 高水位:大于等于这个ID的事务均不可见*/trx_id_t m_low_limit_id;/** 低水位:小于这个ID的事务均可见 */trx_id_t m_up_limit_id;/** 创建该 Read View 的事务ID*/trx_id_t m_creator_trx_id;/** 创建视图时的活跃事务id列表*/ids_t m_ids;/** 配合purge,标识该视图不需要小于m_low_limit_no的UNDO LOG,* 如果其他视图也不需要,则可以删除小于m_low_limit_no的UNDO LOG*/trx_id_t m_low_limit_no;/** 标记视图是否被关闭*/bool m_closed;// 省略...
};
也就是
-
id < m_up_limit_id || id == m_creator_trx_id
事务id小于m_up_limit_id(已提交)或事务id为创建该Read View的事务的id,则可见 -
id >= m_low_limit_id
事务id大于等于m_low_limit_id,则不可见 -
m_ids.empty()
事务id位于m_up_limit_id和m_low_limit_id之间,并且活跃事务id列表为空(即不在活跃列表中),则可见
相关文章:
深入理解MySQL事务(万字详)
文章目录 什么是事务为什么会出现事务事务的版本支持事务的提交方式事务常见操作方式正常演示 - 证明事务的开始与回滚非正常演示1 - 证明未commit,客户端崩溃,MySQL自动会回滚(隔离级别设置为读未提交)非正常演示2 - 证明commit了…...
FFPlay命令全集合
FFPlay是以FFmpeg框架为基础,外加渲染音视频的库libSDL构建的媒体文件播放器。 ffplay工具下载并播放视频,可以辅助卡看流信息。 官网下载地址:http://ffmpeg.org/download.html#build-windows 下载build好的exe程序: 此处下载…...
AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码
AI编程工具使用技巧:在Visual Studio Code中高效利用阿里云通义灵码 前言一、通义灵码介绍1.1 通义灵码简介1.2 主要功能1.3 版本选择1.4 支持环境 二、Visual Studio Code介绍1.1 VS Code简介1.2 主要特点 三、安装VsCode3.1下载VsCode3.2.安装VsCode3.3 打开VsCod…...
开源的Text-to-SQL工具WrenAI
WrenAI是一个开源的Text-to-SQL工具,旨在通过自然语言交互界面,帮助用户更便捷地查询数据库。以下是对WrenAI的详细介绍: 一、主要功能 自然语言交互:用户可以通过对话方式提出问题,WrenAI能够理解和解析复杂的查询需…...
python创建一个httpServer网页上传文件到httpServer
一、代码 1.server.py import os from http.server import SimpleHTTPRequestHandler, HTTPServer import cgi # 自定义请求处理类 class MyRequestHandler(SimpleHTTPRequestHandler):# 处理GET请求def do_GET(self):if self.path /:# 响应200状态码self.send_response(2…...
Linux中page、buffer_head、bio的关系
在Linux中,page、buffer_head、bio这三个概念紧密相关,共同构成了块设备I/O和内存管理的重要部分,它们的联系主要体现在以下方面: page与buffer_head 基于page构建:buffer_head通常是基于page来构建的,一…...
C++11新特性之decltype
1.decltype的作用 decltype是C11新增的一个关键字,与auto的功能一样,都是在编译期间推导变量类型的。不了解auto的可以转到——C11新特性之auto。 为什么引入decltype?看过上边那篇博客的读者应该知道auto在有些场景中并不适用,所以引入declt…...
对神经网络基础的理解
目录 一、《python神经网络编程》 二、一些粗浅的认识 1) 神经网络也是一种拟合 2)神经网络不是真的大脑 3)网络构建需要反复迭代 三、数字图像识别的实现思路 1)建立一个神经网络类 2)权重更新的具体实现 3&am…...
后端开发Web
Maven Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具 Maven的作用 依赖管理 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题 统一项目结构 提供标准、统一的项目结构 项目构建 标准跨平台(…...
QT 通过ODBC连接数据库的好方法:
效果图: PWD使用自己的,我的这是自己的,所以你用不了。 以下是格式。 // 1. 设置数据库连接 QSqlDatabase db QSqlDatabase::addDatabase("QODBC");// 建立和QMYSQL数据库的连接 // 设置数据库连接名称(DSN&am…...
【Feature Scaling】:加速梯度下降法的利器
目录 特征缩放的目的常见的特征缩放方法1. 最小-最大缩放(Min-Max Scaling)2. 标准化(Standardization 或 Z-Score Normalization)3. 最大绝对值缩放(Max Abs Scaling) Rescale的使用场景结论 在机器学习中…...
QT:控件属性及常用控件(3)-----输入类控件(正则表达式)
输入类控件既可以进行显示,也能让用户输入一些内容! 文章目录 1.Line Edit1.1 用户输入个人信息1.2 基于正则表达式的文本限制1.3 验证两次输入的密码是否一致1.4 让输入的密码可以被查看 2.Text Edit2.1 输入和显示同步2.1 其他信号出发情况 3.ComboBox…...
计算机网络 (59)无线个人区域网WPAN
前言 无线个人区域网(WPAN,Wireless Personal Area Network)是一种以个人为中心,采用无线连接方式的个人局域网。 一、定义与特点 定义:WPAN是以个人为中心,实现活动半径小、业务类型丰富、面向特定群体的无…...
Python Typing: 实战应用指南
文章目录 1. 什么是 Python Typing?2. 实战案例:构建一个用户管理系统2.1 项目描述2.2 代码实现 3. 类型检查工具:MyPy4. 常见的 typing 用法5. 总结 在 Python 中,静态类型检查越来越受到开发者的重视。typing 模块提供了一种方式…...
Redis存储③Redis基本命令+内部编号和架构
目录 1. Redis 命令行客户端 1.1 与 Redis 服务器交互 1.2 set 和 get 命令 2. 基本全局命令 2.1 keys 2.2 exists 2.3 del 2.4 expire 2.5 ttl 2.6 type 3. 数据结构和内部编码 4. 单线程架构 本篇完。 1. Redis 命令行客户端 1.1 与 Redis 服务器交互 根据上篇…...
Vivado生成X1或X4位宽mcs文件并固化到flash
1.生成mcs文件 01.在vivado里的菜单栏选择"tools"工具栏 02.在"tools"里选择"生成内存配置文件" 03.配置参数 按照FPGA板上的flash型号进行选型,相关配置步骤可参考下图。 注意:Flash数据传输位宽如果需要选择X4位宽&am…...
07 区块链安全技术
概述 区块链的安全特性 区块链解决了在不可靠网络上可靠地传输信息的难题,由于不依赖与中心节点的认证和管理,因此防止了中心节点被攻击造成的数据泄露和认证失败的风险。 区块链安全防护的三大特点 共识机制代替中心认证机制数据篡改“一发动全身”…...
第84期 | GPTSecurity周报
GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练Transformer(GPT)、人工智能生成内容(AIGC)以及大语言模型(LLM)等安全领域应用的知识。在这里,您可以找…...
柔性数组与c/c++程序中内存区域的划分
1.柔性数组 1.1柔性数组的定义 柔性数组是指在结构体中定义的,其大小在编译时未确定,而在运行时动态分配的数组。这种数组允许结构体的大小根据需要动态变化。语法如下: struct D {int a;int arry1[0]; };struct F {int a;int arry2[]; };…...
react页面定时器调用一组多个接口,如果接口请求返回令牌失效,清除定时器不再触发这一组请求
为了实现一个React页面使用定时器调用一组多个接口,并在任意一个接口请求返回令牌失效时清除定时器且不再触发这一组请求,可以遵循以下步骤: 1. 定义API调用函数:创建一个函数来处理一组API调用。每个API调用都应该检查响应状态以…...
使用 .NET Core 6.0 Web API 上传单个和多个文件
示例代码: https://download.csdn.net/download/hefeng_aspnet/90138968 介绍 我们将在 IFormFile 接口和 .NET 提供的其他接口的帮助下,逐步讨论单个和多个文件上传。 .NET 提供了一个 IFormFile 接口,代表 HTTP 请求中传输的文件。 此外…...
AJAX笔记入门篇
黑马程序员视频地址: 黑马程序员前端AJAX入门到实战全套教程https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p2 目录 AJAX 概念和axios 使用 什么是AJAX? …...
RoHS 简介
RoHS(Restriction of Hazardous Substances Directive,限制有害物质指令)是欧盟制定的一项环保法规,旨在限制电气和电子设备中某些有害物质的使用,以减少这些产品对环境和人体健康的危害。 RoHS限制的有害物质及其限量…...
C# 中 default 使用详解
总目录 前言 在C#中,default 关键字用于表示类型默认值。它可以根据上下文推断出适用的类型,并返回该类型的默认值。随着C#版本的发展,default 的用法也变得更加丰富和灵活。本文将详细介绍 default 在不同场景下的使用方法及其最佳实践。 一…...
无人机在城市执法监管中的应用:技术革新与监管挑战
随着科技的不断进步,无人机技术在城市管理中的应用越来越广泛。无人机以其灵活性、高效性和低成本的优势,正在逐渐成为城市执法监管的得力助手。本文将探讨无人机在城市执法监管中的应用现状、技术优势以及面临的挑战。 无人机技术在城市执法监管中的应用…...
[ACTF2020 新生赛]Upload1
题目 以为是前端验证,试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…...
ASP.NET代码审计 SQL注入篇(简单记录)
sql注入,全局搜索 Request QueryString ToString() select select * aspx是设计页面,而aspx.cs是类页面,也就是说设计页面用到的类信息在这个页面里面,其实就是把设计和实现分离开来。 源码 using System; using System.Collect…...
数据结构 链表2
目录 前言: 一,反转一个链表(迭代) 二,打印一个链表(递归) 三,反转一个链表(递归) 四,双向链表 总结 前言: 我们根据 [文章 链表1] 可以知道链表相比较于数组的优缺点和计算机…...
【leetcode100】二叉树的层序遍历
1、题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 2、初始思路…...
MyBatis进阶
1. 动态SQL 1.1 <if>标签的使用(xml版本) 动态 SQL 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。 现在有一个需求.注册分为两种字段:必填字段和⾮必填字段,那如果在添加用户的时候有不确定的字段传⼊,程…...
迅为RK3568开发板驱动指南Linux中通用SPI设备驱动
在前面的章节中我们从0开始编写了一个mcp2515的驱动程序,而跟I2C设备类似,在Linux内核中也有着通用SPI设备驱动,在本章节将会讲解通用SPI设备驱动的使用,并讲解如何在应用程序中通过ioctl对SPI进行配置和使用。 硬件:迅…...
DDD架构实战第五讲总结:将领域模型转化为代码
云架构师系列课程之DDD架构实战第五讲总结:将领域模型转化为代码 一、引言 在前几讲中,我们讨论了领域模型的重要性及其在业务分析中的渐进获得方法。本讲将聚焦于如何将领域模型转化为代码,使得开发人员能够更轻松地实现用户的领域模型。 二、从模型到代码:领域驱动设计…...
C++----STL(list)
介绍 list的数据结果是一个带头双向链表。 使用 有了前面string、vector的基础,后续关于list使用的讲解主要提及与string和vector的不同之处。 使用文档:cplusplus.com/reference/list/list/?kwlist 迭代器问题 insert以后迭代器不失效 #include…...
软件测试 —— 性能测试(jmeter)
软件测试 —— 性能测试(jmeter) 什么是jmeter安装jmeterjmeter常用组件线程组取样器结果树 我们之前学习了接口测试工具Postman,我们今天要学习的是性能测试工具——jmeter 什么是jmeter Apache JMeter 是一个开源的性能测试工具ÿ…...
Zemax 非序列模式下的颜色检测器和颜色混合
在 Zemax 的非序列模式中,探测器用于捕获系统中射线的信息。可以使用各种类型的探测器来捕获光学系统性能的不同方面,例如矩形探测器,它存储撞击它的 NSC 源射线的能量数据。 另一种经常使用的探测器类型是 Detector Color,它是一…...
DBO优化最近邻分类预测matlab
蜣螂优化算法(Dung Beetle Optimizer,简称 DBO)作为一种新兴的群智能优化算法,于 2022 年末被提出,其灵感主要来源于蜣螂的滚球、跳舞、觅食、偷窃以及繁殖等行为。 本次使用的数据为 Excel 格式的分类数据集。该数据…...
【第二天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-五种常见的排序算法(持续更新)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Python数据结构与算法的详细介绍1.Python中的常用的排序算法1.排序算法的介绍2.五种详细的排序算法代码 总结 前言 提示:这里可以添加本文要记…...
合并两个有序数组(Leetcode)
解题思路: 三个指针: $p1: 指向 nums1 中的最后一个非零元素。$p2: 指向 nums2 的最后一个元素。$p: 指向 nums1 的最后一位,用于存储合并后的元素。 从后往前填充: 比较 nums1[$p1] 和 nums2[$p2],较大的放入 nums1[…...
特殊类设计
[本节目标] 掌握常见特殊类的设计方式 1.请设计一个类,不能被拷贝 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 将拷贝构…...
2025.1.20——一、[RCTF2015]EasySQL1 二次注入|报错注入|代码审计
题目来源:buuctf [RCTF2015]EasySQL1 目录 一、打开靶机,整理信息 二、解题思路 step 1:初步思路为二次注入,在页面进行操作 step 2:尝试二次注入 step 3:已知双引号类型的字符型注入,构造…...
【esp32-uniapp】uniapp小程序篇02——引入组件库
一、引入组件库(可自行选择其他组件库) 接下来介绍colorUI、uview plus的安装,其他的安装可自行查找教程 1.colorUI weilanwl/coloruicss: 鲜亮的高饱和色彩,专注视觉的小程序组件库 下载之后解压,将\coloruicss-ma…...
基于单片机的智能小区门禁系统设计(论文+源码)
1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心,STM32单片机作为主控单元,通过WiFi模块实现与手机APP的连接,构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…...
tkinter绘制组件(44)——浮出ui控件
tkinter绘制组件(44)——浮出ui控件 引言布局函数结构ui框架对齐方向绑定已有控件出现和隐藏逻辑出现和隐藏动画完整代码函数 效果测试代码最终效果 github项目pip下载 引言 TinUI的浮出ui控件(flyout)其实是一个之间创建在UI框架…...
CDSN 2024博客之星总评选-主题文章创作,我的AI之路-起手篇
CDSN 2024博客之星总评选-主题文章创作,我的AI之路-起手篇 一. 回顾自己的机器学习之路二. 2024年的大模型学习三. 对自己的期望 一. 回顾自己的机器学习之路 自2019年起,我开始涉足机器学习领域,最初接触的是通过模型实现自动化的任务&…...
LLM基础知识
代替你的不是ai,而是会使用ai的人。而在这之上还有会打造ai的人。 1、大语言模型的大体现在哪里 LLM(Large Language Model 大语言模型)的大不仅仅是指训练数据巨大,更指参数数量巨大。 参数即模型内部的变量,…...
Linux 网络:交换芯片 EDSA 以太网帧简介
文章目录 1. 前言2. EDSA 协议以太网帧的发送和接收2.1 什么是 EDSA ?2.2 EDSA 以太网帧的发送2.3 EDSA 以太网帧的接收 3. 验证 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. EDS…...
【Git版本控制器--3】Git的远程操作
目录 理解分布式版本控制系统 创建远程仓库 仓库被创建后的配置信息 克隆远程仓库 https克隆仓库 ssh克隆仓库 向远程仓库推送 拉取远程仓库 忽略特殊文件 为什么要忽略特殊文件? 如何配置忽略特殊文件? 配置命令别名 标签管理 理…...
深入理解GPT底层原理--从n-gram到RNN到LSTM/GRU到Transformer/GPT的进化
从简单的RNN到复杂的LSTM/GRU,再到引入注意力机制,研究者们一直在努力解决序列建模的核心问题。每一步的进展都为下一步的突破奠定了基础,最终孕育出了革命性的Transformer架构和GPT大模型。 1. 从n-gram到循环神经网络(RNN)的诞生 1.1 N-gram 模型 在深度学习兴起之前,处理…...
【2024年华为OD机试】 (E卷,200分) - 最优资源分配芯片资源占用(JavaScriptJava PythonC/C++)
一、问题描述 题目解析 题目描述 某块业务芯片的最小容量单位为 1.25G,总容量为 M * 1.25G。芯片资源编号为 1, 2, …, M。该芯片支持 3 种不同的配置,分别为 A、B、C: 配置 A:占用容量为 1.25G(1 个单位ÿ…...
Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
一、整个前言 在基于 Ruoyi 框架进行系统开发的过程中,我们常常会遇到各种有趣且具有挑战性的问题。今天,我们就来深入探讨一个在实际开发中较为常见的问题:当连续快速发送 Post 请求时,前端会弹出 “数据正在处理,请…...