MySQL的并发控制、事务、日志

目录

一.并发控制

1.锁机制

2.加锁与释放锁

二.事务(transactions)

1.事物的概念

2.ACID特性

3.事务隔离级别

三.日志

1.事务日志

2.错误日志

3.通用日志

4.慢查询日志

5.二进制日志 备份


一.并发控制

在 MySQL 中,并发控制是确保多个用户同时访问数据库时数据一致性和完整性的重要机制。

1.锁机制

锁类型

读锁:共享锁,也称为 S 锁,只读不可写(包括当前事务) ,多个读互不阻塞 只能读 不能写 别人也能看

写锁:独占锁,排它锁,也称为 X 锁,写锁会阻塞其它事务(不包括当前事务)的读和写 写锁 别人看都看不了

锁特征:S 锁和 S 锁是兼容的,X 锁和其它锁都不兼容,举个例子,事务 T1 获取了一个行 r1 的 S 锁,另外事务 T2 可以立即获得行 r1 的 S 锁,此时 T1 和 T2 共同获得行 r1 的 S 锁,此种情况称为锁兼容,但是另外一个事务 T2 此时如果想获得行 r1 的 X 锁,则必须等待 T1 对行 r1 锁的释放,此种情况也称为锁冲突

锁粒度

表锁:最基本的锁机制,对整个表进行锁定,其他会话无法同时修改整个表。

行级锁:允许不同会话同时修改表中的不同行,提高并发性能。MySQL 支持的行级锁包括读取锁(Shared Lock)和写入锁(Exclusive Lock)。

实现

存储引擎:自行实现其锁策略和锁粒度

服务器级:实现了锁,表级锁,用户可显式请求

分类:

隐式锁:由存储引擎自动施加锁

显式锁:用户手动请求

锁策略:在锁粒度及数据安全性寻求的平衡机制

当开启锁时在两个终端同时发送一个命令时只有一台能够实现成功

update students set teacherid=1 where stuid=1;

2.加锁与释放锁

lock  tables  表名  read; #加读锁
lock  tables  表名  write; #加写锁
unlock  tables; #释放锁
flush  tables  with  read lock; #整个数据库加锁

二.事务(transactions)

1.事物的概念

事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。

事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元。

事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等。

事务通过事务的整体性以保证数据的一致性。

事务能够提高在向表中更新和插入信息期间的可靠性。

2.ACID特性

A:atomicity 原子性;整个事务中的所有操作要么全部成功执行,要么全部失败后回滚

C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性状态,类似于质量守恒定律(A1wB 0 A1w 给 B转1w 始终保持A+B=1w)

I: Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务所见;隔离有多种隔离级别,实现并发.(不最后提交看不到,脏数

D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中

事务结构视图:

begin  #开启事务
set autocommit=0/1  #是否自动提交事务  退出后要再加commit或者rollback
commit 保存退出   rollback  回滚

示例:

(1)将自动提交事务关闭,当执行增删改查操作时需要输入commit或者rollback保存事务

关闭自动提交事务

select @@autocommit;   # 查看自动提交事务变量是否开启
set autocommit=0;      # 关闭自动提交事务  1 为开启

使用insert命令给teachers表中增加一个数据,先不使用commit命令在另一个终端查看

insert  teachers  values(5,'cxk',32,'M');
select * from teachers;

使用commit命令保存后查看

(2)当事务自动提交关闭时,删除teachers表中所有数据,没有使用commit提交,使用rollback回滚,查看表中数据,依然还存在

delete from teachers;
select * from teachers;
rollback;  #回滚      create  drop alter  这些撤回不了
select * from teachers;

数据库事务死锁是指两个或多个事务在执行过程中因互相持有对方所需的资源而无法继续执行的情况。这种情况会导致数据库系统中的事务无法完成,从而影响系统的正常运行。

发生原因

  1. 资源互斥:事务在操作数据库对象(如行、表)时会申请锁,若多个事务同时请求同一资源且彼此互斥,可能导致死锁。

  2. 循环等待:多个事务形成一个循环等待资源的链条,每个事务都在等待下一个事务所持有的资源,从而造成死锁。

具体场景与解决方法

  • 示例场景

    • 事务A:持有资源R1,请求资源R2。
    • 事务B:持有资源R2,请求资源R1。 这种情况下,如果事务A和事务B都不能释放当前持有的资源,它们将无法继续执行下去,造成死锁。
  • 解决方法

    • 超时机制:数据库系统可以设置一个超时时间,当事务持有锁的时间超过设定阈值时,系统可以选择终止其中一个事务,从而打破死锁。
    • 死锁检测与回滚:数据库系统可以周期性地检测是否存在死锁,并在检测到死锁时,选择其中一个事务进行回滚,释放资源,允许其他 [Something went wrong, please try again later.]
BEGIN;
#开启事务
update students set classid=10;
#终端1
update students set classid=20;
#终端2
show engine innodb status;
#在第三个会话中执行

3.事务隔离级别

MySQL 支持四种隔离级别,事务隔离级别从上至下更加严格

1)未提交读( Read Uncommitted(RU))
允许脏读,即允许一个事务可以看到其他事务未提交的修改。

2)提交读(Read Committed(RC))
允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的,防止脏读。

3)可重复读(Repeatable Read(RR))—mysql默认的隔离级别
确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改;

可以防止脏读和不可重复读。

4)串行读(Serializable)—相当于锁表
完全串行化的读,将一个事务与其他事务完全地隔离;

每次读都需要获得表级共享锁,读写相互都会阻塞;

可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的效率。

隔离级别脏读可重复读幻读加读锁
读未提交可以出现可以出现可以出现
读提交不允许出现可以出现可以出现
可重复读不允许出现不允许出现可以出现
序列化不允许出现不允许出现不允许出现

mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed 。

MVCC和事务的隔离级别:

MVCC(多版本并发控制机制)只在READ COMMITTED和REPEATABLE READ两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容,因为READ UNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则会对所有读取的行都加锁

select @@tx_isolation;    #系统隔离级别,是系统自带变量

示例:

(1)可重复读(Repeatable Read(RR))—mysql默认的隔离级别

vim /etc/my.cnf
[mysqld]
transaction-isolation=REPEATABLE-READ

 终端1
begin;
insert teachers values(null,'cxk',32,'M');
select * from teachers;
commit;

 终端2
begin;  #需要在终端1增加数据前操作
select * from teachers;
commit;  #提交    最后操作

在终端2,使用commit命令提交前,查看不到teachers表中新增的命令

当终端2使用commit命令提交后,查看teachers表中数据,可以看到增加了tid为7的数据

第一隔离级别 可看见脏读

vim /etc/my.cnf
[mysqld]
transaction-isolation=READ-UNCOMMITTED

systemctl restart mysqld

select @@tx_isolation;   #查看隔离级别 

begin;
#在其中一个终端上插入数据在未提交前,另一终端也可以看见
insert teachers values(6,'c',80,'M');
select * from teachers;

串行化 最严格的隔离级别

vim /etc/my.cnf
[mysqld]
transaction-isolation=SERIALIZABLE
systemctl restart mysqld

begin;
#开启事务两边可以同时读表,会互相锁
select * from teachers;
delete from teachers where tid=5;
#无法删除加锁  并发性较差

三.日志

MySQL 支持丰富的日志类型,如下:

  • 事务日志:transaction log

    事务日志的写入类型为"追加",因此其操作为"顺序IO";通常也被称为:预写式日志 write ahead logging事务日志文件: ib_logfile0, ib_logfile1

  • 错误日志 error log

  • 通用日志 general log

  • 慢查询日志 slow query log

  • 二进制日志 binary log

  • 中继日志 reley log,在主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取的事件

语法:

CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
routime_body 
proc_parameter : [IN|OUT|INOUT] parameter_name type

1.事务日志

事务日志:transaction log

  • redo log:实现 WAL(Write Ahead Log) ,数据更新前先记录redo log

  • undo log:保存与执行的操作相反的操作,用于实现rollback

事务型存储引擎自行管理和使用,建议和数据文件分开存放

Innodb事务日志相关配置:

show variables like '%innodb_log%'; #查看与 InnoDB 存储引擎的日志相关的配置变量
innodb_log_file_size   50331648 #每个日志文件大小  字节
innodb_log_files_in_group 2     #日志组成员个数
innodb_log_group_home_dir ./ #事务文件路径

#LIKE 是 SQL 的一个条件匹配操作符,用于筛选满足指定模式的字符串。
% 是通配符,表示零个或多个字符。
'innodb_log%' 是一个模式,表示以 innodb_log 开头的字符串。

ll -h /var/lib/mysql

事务日志性能优化

innodb_flush_log_at_trx_commit=0|1|2

select @@innodb_flush_log_at_trx_commit;
#查看默认值

1 此为默认值,日志缓冲区将写入日志文件,并在每次事务后执行刷新到磁盘。 这是完全遵守ACID特性

0 提交时没有写磁盘的操作; 而是每秒执行一次将日志缓冲区的提交的事务写入刷新到磁盘。 这样可提供更好的性能,但服务器崩溃可能丢失最后一秒的事务

2 每次提交后都会写入OS的缓冲区,但每秒才会进行一次刷新到磁盘文件中。 性能比0略差一些,但操作系统或停电可能导致最后一秒的交易丢失

级别012
安全性较高最高最高
性能最高最差较高

高并发业务行业最佳实践,是使用第三种折中配置(=2):

1.配置为2和配置为0,性能差异并不大,因为将数据从Log Buffer拷贝到OS cache,虽然跨越用户态与内核态,但毕竟只是内存的数据拷贝,速度很快

2.配置为2和配置为0,安全性差异巨大,操作系统崩溃的概率相比MySQL应用程序崩溃的概率,小很多,设置为2,只要操作系统不奔溃,也绝对不会丢数据

双1设置:

说明:

  • 设置为1,同时sync_binlog = 1表示最高级别的容错 (二进制日志)

  • innodb_use_global_flush_log_at_trx_commit=0 时,将不能用SET语句重置此变量( MariaDB 10.2.6 后废弃)

修改参数:
set  global innodb_flush_log_at_trx_commit=1;
select @@innodb_flush_log_at_trx_commit;
call sp_testlog;
  1. set global innodb_flush_log_at_trx_commit=1;

    • 这是一个MySQL的系统变量设置命令。innodb_flush_log_at_trx_commit 是控制InnoDB存储引擎如何处理事务提交时的日志刷新行为的参数。
    • 设置为 1 表示每次事务提交时都会强制刷新事务日志到磁盘,这是最安全的设置,可以确保事务的持久性(即事务提交后,数据不会丢失)。
    • 该设置通常用于要求高数据安全性和一致性的场景,但也可能会对性能产生一定影响。
  2. select @@innodb_flush_log_at_trx_commit;

    • 这条语句是用来查询当前 innodb_flush_log_at_trx_commit 参数的设置值的命令。
    • 如果在上一步设置成功的话,这里应该会返回 1,表示已经将参数设置为每次事务提交时都刷新日志到磁盘。
  3. call sp_testlog;

    • 这是调用一个名为 sp_testlog 的存储过程(Stored Procedure)的命令。
    • 存储过程是一组预先编译好的SQL语句集合,可以在需要时通过一个单独的调用来执行。
    • sp_testlog 是一个自定义的存储过程,它可能被用来进行一些特定的测试或者操作,具体的功能需要查看存储过程的定义来确定。

2.错误日志

错误日志

  • mysqld启动和关闭过程中输出的事件信息

  • mysqld运行中产生的错误信息

  • event scheduler运行一个event时产生的日志信息

  • 在主从复制架构中的从服务器上启动从服务器线程时产生的信息

SHOW GLOBAL VARIABLES LIKE 'log_error' ;

yum  安装
cat /var/log/mysqld.log

记录哪些警告信息至错误日志文件*

#CentOS7 mariadb 5.5 默认值为1
#CentOS8 mariadb 10.3 默认值为2
log_warnings=0|1|2|3...         #MySQL5.7之前
log_error_verbosity=0|1|2|3...   #MySQL8.0

3.通用日志

通用日志:记录对数据库的通用操作,包括:错误的SQL语句

通用日志可以保存在:file(默认值)或 table(mysql.general_log表)

通用日志相关设置

general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE

示例:

范例: 启用通用日志并记录至文件中

select @@general_log;     #默认没开启
set global general_log=1; #开启

SHOW GLOBAL VARIABLES LIKE 'log_output';
#默认通用日志存放在文件中
select @@general_log_file;
#通用日志存放的文件路径

4.慢查询日志

慢查询日志:记录执行查询时长超出指定时长的操作

慢查询相关变量

slow_query_log=ON|OFF #开启或关闭慢查询,支持全局和会话,只有全局设置才会生成慢查询文件
long_query_time=N #慢查询的阀值,单位秒,默认为10s
slow_query_log_file=HOSTNAME-slow.log  #慢查询日志文件
log_slow_filter = admin,filesort,filesort_on_disk,full_join,full_scan,
query_cache,query_cache_miss,tmp_table,tmp_table_on_disk 
#上述查询类型且查询时长超过long_query_time,则记录日志
log_queries_not_using_indexes=ON  #不使用索引或使用全索引扫描,不论是否达到慢查询阀值的语
句是否记录日志,默认OFF,即不记录
log_slow_rate_limit = 1 #多少次查询才记录,mariadb特有
log_slow_verbosity= Query_plan,explain #记录内容
log_slow_queries = OFF    #同slow_query_log,MariaDB 10.0/MySQL 5.6.1 版后已删除

set  global slow_query_log=1;
#开启
set long_query_time=1;

select sleep(10)

5.二进制日志 备份

  • 记录导致数据改变或潜在导致数据改变的SQL语句

  • 记录已提交的日志

  • 不依赖于存储引擎类型

功能:通过"重放"日志文件中的事件来生成数据副本

注意:建议二进制日志和数据文件分开存放

二进制日志记录三种格式

基于"语句"记录:statement,记录语句,默认模式( MariaDB 10.2.3 版本以下 ),日志量较少

基于"行"记录:row,记录数据,日志量较大,更加安全,建议使用的格式,MySQL8.0默认格式

混合模式:mixed, 让系统自行判定该基于哪种方式进行,默认模式( MariaDB 10.2.4及版本以上)

show variables like 'binlog_format';

二进制日志文件格式

有两类文件
1.日志文件:mysql|mariadb-bin.文件名后缀,二进制格式,如: on.000001,mariadb-bin.000002
2.索引文件:mysql|mariadb-bin.index,文本格式,记录当前已有的二进制日志文件列表

二进制日志相关的服务器变量:

sql_log_bin=ON|OFF:
#是否记录二进制日志,默认ON,支持动态修改,系统变量,而非服务器选项
log_bin=mysql-bin      默认是关闭
#指定文件位置;默认OFF,表示不启用二进制日志功能,上述两项都开启才可以
binlog_format=STATEMENT|ROW|MIXED:
#二进制日志记录的格式,mariadb5.5默认STATEMENT
max_binlog_size=1073741824:
#单个二进制日志文件的最大体积,到达最大值会自动滚动,默认为1G
#说明:文件达到上限时的大小未必为指定的精确值
binlog_cache_size=4m 
#此变量确定在每次事务中保存二进制日志更改记录的缓存的大小(每次连接)
max_binlog_cache_size=512m 
#限制用于缓存多事务查询的字节大小。
sync_binlog=1|0:
#设定是否启动二进制日志即时同步磁盘功能,默认0,由操作系统负责同步日志到磁盘
expire_logs_days=N:
#二进制日志可以自动删除的天数。 默认为0,即不自动删除

在线查看  二进制

SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
例子:
show binlog events in 'mysql-bin.000001' from 6516 limit 2,3

离线查看二进制日志

mysqlbinlog:二进制日志的客户端命令工具,支持离线查看二进制日志

命令格式:

mysqlbinlog [OPTIONS] log_file…
 --start-position=# 指定开始位置
 --stop-position=#
 --start-datetime=  #时间格式:YYYY-MM-DD hh:mm:ss
 --stop-datetime= 
 --base64-output[=name]
        -v -vvv
        
# at 328
#151105 16:31:40 server id 1 end_log_pos 431   Query   thread_id=1     
exec_time=0     error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;  
事件发生的日期和时间:151105 16:31:40
事件发生的服务器标识:server id 1
事件的结束位置:end_log_pos 431
事件的类型:Query 
事件发生时所在服务器执行此事件的线程的ID:thread_id=1
语句的时间戳与将其写入二进制文件中的时间差:exec_time=0
错误代码:error_code=0
事件内容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本专属属性:GTID

例子

mysqlbinlog --start-position=678 --stop-position=752 /var/lib/mysql/mariadb-bin.000003 -v
mysqlbinlog  --start-datetime="2018-01-30 20:30:10"   --stop-datetime="2018-01-
30 20:35:22" mariadb-bin.000003 -vvv

二进制日志事件的格式:

# at 328
#151105 16:31:40 server id 1 end_log_pos 431   Query   thread_id=1     
exec_time=0     error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;  
事件发生的日期和时间:151105 16:31:40
事件发生的服务器标识:server id 1
事件的结束位置:end_log_pos 431
事件的类型:Query 
事件发生时所在服务器执行此事件的线程的ID:thread_id=1
语句的时间戳与将其写入二进制文件中的时间差:exec_time=0
错误代码:error_code=0
事件内容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本专属属性:GTID

 删除二进制日志

purge binary logs to 'mysql-bin.000002';
#代表删除002 之前的  日志

彻底清空二进制日志

reset  master;

刷新日志

flush logs;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/775350.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Build a Large Language Model (From Scratch)附录B(gpt-4o翻译版)

来源:https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

模拟,CF 570C - Replacement

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 570C - Replacement 二、解题报告 1、思路分析 1、长为cnt的连续串的最小操作次数为cnt - 1 2、每次将一个非. 替换为. f要么增加1要么增加2 只有前后都是 . 的时候会增加2 同理,当我们将一…

【漏洞复现】飞企互联-FE企业运营管理平台——SQL注入

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据…

针对某客户报表系统数据库跑批慢进行性能分析及优化

某客户报表系统数据库跑批时间过长,超出源主库较多,故对其进行了分析调优,目前状态如下: 1、业务连接的rac的scanip,因为负载均衡将跑批的连接连接到了多个计算节点导致节点间通讯成本较高,故速率缓慢&…

2024年7月6日 十二生肖 今日运势

小运播报:2024年7月6日,星期六,农历六月初一 (甲辰年庚午月辛未日),法定节假日。 红榜生肖:猪、马、兔 需要注意:狗、鼠、牛 喜神方位:西南方 财神方位:正…

Android - 模拟器

Android SDK 包括一个在您的计算机上运行的虚拟移动设备模拟器。 该模拟器可让您在不使用物理设备的情况下对 Android 应用程序进行原型设计、开发和测试。 在本章中,我们将探索真实安卓设备中存在的模拟器中的不同功能。 创建 AVD 如果您想模拟真实设备&#xff0c…

机器人典型的交互任务、阻抗控制的示意图、内涵、意义、存在的交互控制科学问题

机器人典型的交互任务 机器人在实际应用中经常需要完成与环境的交互任务,这些任务包括但不限于: 装配任务:在制造业中,机器人需要准确地操控和组装各种零部件,包括不同形状、大小和材质的物体。搬运任务:…

docker-compose搭建prometheus、grafana

一、安装prometheus 1、安装 version: 3.1services:prometheus:image: prom/prometheus:v2.48.0container_name: prometheushostname: prometheusrestart: alwaysvolumes:- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml- ./prometheus/:/etc/prometheus/port…

strcpy,srtcmp,strlen函数漏洞利用

strcpy,srtcmp,strlen函数漏洞利用 strcpy strcpy函数用于将字符串复制到另一个指针指向的空间中,遇到空字符 **b’x\00’**时停止,: 所以可以利用 strcpy不检查缓冲区 的漏洞(构造的字符串要以\0结尾),…

Ubuntu / Debian安装FTP服务

本章教程,记录在Ubuntu中安装FTP服务的具体步骤。FTP默认端口:21 1、安装 pure-ftpd sudo apt-get install pure-ftpd2、修改默认配置 # 与 centos 不同,这里需要在 /etc/pure-ftpd/conf 文件夹下执行下列命令,增加对应配置文件: # 创建 /etc/pure-ftpd/conf/PureDB 文件…

半导体制造企业 文件共享存储应用

用户背景:半导体设备(上海)股份有限公司是一家以中国为基地、面向全球的微观加工高端设备公司,为集成电路和泛半导体行业提供具竞争力的高端设备和高质量的服务。 挑战:芯片的行业在国内迅猛发展,用户在上海…

3033.力扣每日一题7/5 Java

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先创建一个与…

Vue3从入门到精通(三)

vue3插槽Slots 在 Vue3 中&#xff0c;插槽&#xff08;Slots&#xff09;的使用方式与 Vue2 中基本相同&#xff0c;但有一些细微的差异。以下是在 Vue3 中使用插槽的示例&#xff1a; // ChildComponent.vue <template><div><h2>Child Component</h2&…

解决前后端同一个端口跨域问题

前端起了一个代理 如果url是api开头的自动代理访问8080端口&#xff08;解决前后端端口不一致要么是前端代理&#xff0c;要么是后端加过滤器&#xff09; proxy:{/api:{target:http://localhost:8080,changeOrigin : true,// 替换去掉路径上的api// rewrite:(path)>path.r…

java集合(1)

目录 一.集合概述 二. 集合体系概述 1. Collection接口 1.1 List接口 1.2 Set接口 2. Map接口 三. ArrayList 1.ArrayList常用方法 2.ArrayList遍历 2.1 for循环 2.2 增强for循环 2.3 迭代器遍历 一.集合概述 我们经常需要存储一些数据类型相同的元素,之前我们学过…

(2024)KAN: Kolmogorov–Arnold Networks:评论

KAN: Kolmogorov–Arnold Networks: A review 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. MLP 也有可学习的激活函数 2. 标题的意义 3. KAN 是具有样条基激活函数的 M…

昇思25天学习打卡营第17天(+1)|Diffusion扩散模型

1. 学习内容复盘 本文基于Hugging Face&#xff1a;The Annotated Diffusion Model一文翻译迁移而来&#xff0c;同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c;执行Python文件时&#xff0c;请确…

安乃达:看不懂的募资

不好玩啊&#xff0c;高标接连被S&#xff0c;市场激进资金找到了新股作为抱团方向。 首日大涨超100%&#xff0c;两日涨幅133%&#xff0c;今天果不其然被电风扇刮走了&#xff0c;今天我们聊聊新加入A股大本营的公司——安乃达。 首先&#xff0c;安乃达是国内直驱轮毂电机头…

vulnhub--IMF

环境 攻击机&#xff1a;192.168.96.4 靶机&#xff1a;ip未知 主机探测 确定靶机ip为32的主机 端口扫描 访问80端口 外围打点 在contact.php页面源码中找到了flag1 之后没啥突破 但查看网络后发现contact.php页面请求的三个js文件的文件名很有特点&#xff0c;猜测是base64编码…

数据结构——队列练习题

在C语言中&#xff0c;.和->运算符用于访问结构体的成员变量。它们之间的区别在于&#xff1a;.运算符用于访问结构体变量的成员。->运算符用于访问结构体指针变量的成员 1a&#xff08;rear指向队尾元素后一位&#xff0c;判空判满时牺牲一个存储单元&#xff09; 首先…