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;

数据库事务死锁是指两个或多个事务在执行过程中因互相持有对方所需的资源而无法继续执行的情况。这种情况会导致数据库系统中的事务无法完成,从而影响系统的正常运行。
发生原因
-
资源互斥:事务在操作数据库对象(如行、表)时会申请锁,若多个事务同时请求同一资源且彼此互斥,可能导致死锁。
-
循环等待:多个事务形成一个循环等待资源的链条,每个事务都在等待下一个事务所持有的资源,从而造成死锁。
具体场景与解决方法
-
示例场景:
- 事务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-UNCOMMITTEDsystemctl restart mysqldselect @@tx_isolation; #查看隔离级别 begin;
#在其中一个终端上插入数据在未提交前,另一终端也可以看见
insert teachers values(6,'c',80,'M');
select * from teachers;
串行化 最严格的隔离级别
vim /etc/my.cnf
[mysqld]
transaction-isolation=SERIALIZABLE
systemctl restart mysqldbegin;
#开启事务两边可以同时读表,会互相锁
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略差一些,但操作系统或停电可能导致最后一秒的交易丢失

| 级别 | 0 | 1 | 2 |
|---|---|---|---|
| 安全性 | 较高 | 最高 | 最高 |
| 性能 | 最高 | 最差 | 较高 |
高并发业务行业最佳实践,是使用第三种折中配置(=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;
set global innodb_flush_log_at_trx_commit=1;
- 这是一个MySQL的系统变量设置命令。
innodb_flush_log_at_trx_commit是控制InnoDB存储引擎如何处理事务提交时的日志刷新行为的参数。- 设置为
1表示每次事务提交时都会强制刷新事务日志到磁盘,这是最安全的设置,可以确保事务的持久性(即事务提交后,数据不会丢失)。- 该设置通常用于要求高数据安全性和一致性的场景,但也可能会对性能产生一定影响。
select @@innodb_flush_log_at_trx_commit;
- 这条语句是用来查询当前
innodb_flush_log_at_trx_commit参数的设置值的命令。- 如果在上一步设置成功的话,这里应该会返回
1,表示已经将参数设置为每次事务提交时都刷新日志到磁盘。
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;
相关文章:
MySQL的并发控制、事务、日志
目录 一.并发控制 1.锁机制 2.加锁与释放锁 二.事务(transactions) 1.事物的概念 2.ACID特性 3.事务隔离级别 三.日志 1.事务日志 2.错误日志 3.通用日志 4.慢查询日志 5.二进制日志 备份 一.并发控制 在 MySQL 中,并发控制是确…...
CNN文献综述
卷积神经网络(Convolutional Neural Networks,简称CNN)是深度学习领域中的一种重要模型,主要用于图像识别和计算机视觉任务。其设计灵感来自于生物学中视觉皮层的工作原理,能够高效地处理图像和语音等数据。 基本原理…...
python语句前面有一个$是什么意思
“$”是汇编语言中的一个预定义符号,等价于当前正汇编到的段的当前偏移值。例如:指令“jmp $3”中的“$”表示当前这条指令在代码段中的偏移量。 代表当前指令的地址,如: data segment str1 db a,b,c,d leng equ $-str 就是当前地…...
wsl安装Linux系统到指定位置
默认情况下,wsl安装的系统,会安装到系统C盘,长期下去,很容易把C盘的空间消耗完,从而影响系统的正常运行,所以我建议是将wsl所有的系统都安装到其它磁盘中,便于维护。 1、导出镜像 通过wsl -l -v 查看当前已安装的系统版本。 导出到当前目录位置,也可以指定目录位置。 w…...
[笔记] 高等数学在各工程门类的典型应用场景
1.应用场景 1.微积分似乎是在解算椭圆方程中引入的?但是这个数学工具第一次应用于现实的工程问题是什么时候?什么场景?什么问题? 微积分的发展确实与椭圆方程有关,但它最初的应用场景远不止于此。 微积分首次被应用…...
刀片服务器和机架式服务器有何区别
刀片服务器和机架式服务器有何区别 一、物理设计: 刀片服务器:刀片服务器是一种相对较轻薄的服务器设计,其物理形状类似于刀片,通常插入到专用的刀片机箱中。每个刀片通常包含一个或多个服务器节点,共享一些基本的资源…...
SQLyog脚本无限试用重置脚本
文章目录 引言脚本(win)必要操作、说明 引言 SQLyog 需要po jie,但是网上的没看到很好使的,直接下的官方。能处理14天试用也是很ok的。 脚本(win) echo offREM SQLyog注册表key,可能跟你的不一样,如果不一样,请替换…...
代码随想录训练营第二十九天 134加油站 135分发糖果 860柠檬水找零 406根据身高重建队列
第一题: 原题链接:134. 加油站 - 力扣(LeetCode) 思路: 需要三个变量,一个变量start记录结果也就是出发的第一个加油站,一个变量curSum来记录此时加油耗油后剩余的油量,如果发现c…...
智能生产管理系统设计
智能生产管理系统的设计旨在提升制造业的效率、灵活性和响应速度,通过集成先进的信息技术(如物联网IoT、大数据分析、人工智能AI、云计算等)实现生产过程的智能化。以下是一些关键设计要素和步骤,用于构建一个高效的智能生产管理系…...
满足GMSL静电防护要求的方案
什么是GMSL?它是做什么用的?它有什么优点?设计GMSL防静电有啥难度? 带着这些疑问我们先了解下什么是GMSL。 一.简述 GMSL GMSL(Gigabit Multimedia Serial Link)即千兆多媒体串行链路…...
【Odoo开源ERP】别把ERP与进销存软件混为一谈
导读:企业使用ERP软件能够实现管理升级,多方信息集成,按照既定策略逻辑运算,生成计划建议,减少人力成本,提高准确率的同时提高经营能力。 ERP,是MRP II的下一代软件,除了MRP II已有的…...
八、浏览器同源策略
上一篇👉: 浏览器垃圾回收机制 文章目录 浏览器同源策略1.同源策略的定义2.同源策略的作用3.同源策略的限制范围4.解决跨域方案汇总1.CORS(跨源资源共享)2.JSONP3.postMessage 跨域4.Nginx代理跨域5.Node.js中间件代理跨域6.document.domain…...
重载赋值运算符
c编译器可能会给类添加四个函数 1默认构造函数 2默认析构函数 3默认拷贝构造函数,对成员变量进行浅拷贝。 4默认赋值函数,队成员变量进行浅拷贝。 #include<iostream> using namespace std; class CGirl { public:int m_bh;string m_name;voi…...
数字信号处理及MATLAB仿真(2)——离散系统
上回书说到如何来编写一些简单的离散时间序列,今天咱们就来谈谈一些关于常系数差分方程的操作吧。 说到这里咱们对于常系数差分方程可能最关心的就是怎么去求解了。 其中最关键的部分就是filter函数,可以用来计算系统在输入信号为x的输出信号y。大家学过…...
大模型思维链(Chain-of-Thought)技术原理
大模型思维链(Chain-of-Thought)技术原理 NLP中 大语言模型LLM中的思维链 Chain-of-Thought(CoT) GoT_cot思维链-CSDN博客 https://zhuanlan.zhihu.com/p/680618940 https://zhuanlan.zhihu.com/p/661475269...
gda动态调试-cnblog
忽的发现gda有动态调试功能 动态监听返回值 框柱指定方法,选择调试方法,gda会自动监听函数的返回值,例如 自定义frida脚本 gda会自动生成hook该函数的frida脚本...
Double 4 VR仿真情景实训教学系统在法律专业课堂上的应用
随着科技的飞速发展,VR技术逐渐渗透到各个领域,为教育行业带来了革命性的变化。 VR技术以其独特的沉浸式体验,为法律课堂带来了前所未有的学习体验。通过Double 4 VR仿真情景实训教学系统,学生可以身临其境地进入虚拟的仿真情景中…...
k8s-第一节-minikube
minikube 服务器启动 # 启动集群 minikube start # 启动集群并使用docker驱动 minikube start --driverdocker To make docker the default driver:minikube config set driver docker # 查看节点。kubectl 是一个用来跟 K8S 集群进行交互的命令行工具 kubectl get node # 停…...
html+js+css在线倒计时
代码在图片后面 点赞加关注 谢谢大佬照顾😜 图例 时间到前 时间到后 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width,…...
构建LangChain应用程序的示例代码:55、如何实现多代理模拟,其中特权代理决定谁发言。这遵循与多代理分散发言者选择相反的选择方案
示例展示了如何实现一个多代理模拟,其中一个特权代理决定谁来发言。 这遵循与多代理分散式发言人选择相反的选择方案。 我们在一个虚构的新闻网络模拟环境中展示这种方法的一个例子。这个例子将展示我们如何实现能够: 在说话前思考终止对话 的代理。 导入LangChain相关模块…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
