Mysql锁机制介绍

news2025/1/13 11:58:17

Mysql锁机制

锁是计算机协调多个进程或线程并发访问某一资源的机制。

在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说锁对数据库而言显得尤其重要,也更加复杂。

使用锁会影响数据库的性能

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FFAexPah-1687868884430)(assets/1687868819251-166.png)]

锁的分类

从对数据操作的类型(读/写)分

  • 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
  • 写锁(排它锁):当前写操作没有完成前,他会阻断其他写锁和读锁

从对数据操作的粒度分

表锁(偏读)

锁住整个表

特点:表锁偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。

表锁演示
建表sql
create table mylock (
id int not null primary key auto_increment,
name varchar(20) default ''
) engine myisam;

insert into mylock(name) values('a');
insert into mylock(name) values('b');
insert into mylock(name) values('c');
insert into mylock(name) values('d');
insert into mylock(name) values('e');

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtZEUEKc-1687868884431)(assets/1687868819251-167.png)]

加锁、解锁命令

查看数据库中的哪些表加过锁

SHOW OPEN TABLES;
mysql> use advanced_mysql_learning;
Database changed
mysql> SHOW OPEN TABLES;
+-------------------------+---------------------------+--------+-------------+
| Database                | Table                     | In_use | Name_locked |
+-------------------------+---------------------------+--------+-------------+
| mysql                   | check_constraints         |      0 |           0 |
| mysql                   | column_type_elements      |      0 |           0 |
| mysql                   | slave_master_info         |      0 |           0 |
| mysql                   | foreign_keys              |      0 |           0 |
| mysql                   | columns                   |      0 |           0 |
| mysql                   | foreign_key_column_usage  |      0 |           0 |
| mysql                   | server_cost               |      0 |           0 |
| mysql                   | index_column_usage        |      0 |           0 |
| mysql                   | view_table_usage          |      0 |           0 |
| mysql                   | index_partitions          |      0 |           0 |
| mysql                   | indexes                   |      0 |           0 |
| mysql                   | schemata                  |      0 |           0 |
| mysql                   | collations                |      0 |           0 |
| mysql                   | table_partition_values    |      0 |           0 |
| mysql                   | table_partitions          |      0 |           0 |
| mysql                   | tables                    |      0 |           0 |
| mysql                   | role_edges                |      0 |           0 |
| mysql                   | triggers                  |      0 |           0 |
| mysql                   | column_statistics         |      0 |           0 |
| mysql                   | view_routine_usage        |      0 |           0 |
| mysql                   | gtid_executed             |      0 |           0 |
| mysql                   | engine_cost               |      0 |           0 |
| mysql                   | component                 |      0 |           0 |
| mysql                   | user                      |      0 |           0 |
| mysql                   | db                        |      0 |           0 |
| mysql                   | tables_priv               |      0 |           0 |
| mysql                   | columns_priv              |      0 |           0 |
| performance_schema      | session_status            |      0 |           0 |
| mysql                   | procs_priv                |      0 |           0 |
| mysql                   | proxies_priv              |      0 |           0 |
| mysql                   | default_roles             |      0 |           0 |
| mysql                   | global_grants             |      0 |           0 |
| mysql                   | servers                   |      0 |           0 |
| mysql                   | password_history          |      0 |           0 |
| mysql                   | time_zone_transition      |      0 |           0 |
| mysql                   | time_zone_leap_second     |      0 |           0 |
| mysql                   | table_stats               |      0 |           0 |
| mysql                   | time_zone_name            |      0 |           0 |
| mysql                   | time_zone                 |      0 |           0 |
| advanced_mysql_learning | mylock                    |      0 |           0 |
| mysql                   | time_zone_transition_type |      0 |           0 |
| mysql                   | tablespace_files          |      0 |           0 |
| mysql                   | func                      |      0 |           0 |
| mysql                   | slave_relay_log_info      |      0 |           0 |
| information_schema      | TABLES                    |      0 |           0 |
| mysql                   | slave_worker_info         |      0 |           0 |
| mysql                   | routines                  |      0 |           0 |
| mysql                   | events                    |      0 |           0 |
| mysql                   | catalogs                  |      0 |           0 |
| information_schema      | SCHEMATA                  |      0 |           0 |
| mysql                   | character_sets            |      0 |           0 |
| advanced_mysql_learning | emp                       |      0 |           0 |
| mysql                   | tablespaces               |      0 |           0 |
| performance_schema      | session_variables         |      0 |           0 |
| information_schema      | COLUMNS                   |      0 |           0 |
| information_schema      | ROUTINES                  |      0 |           0 |
| information_schema      | PARAMETERS                |      0 |           0 |
| mysql                   | parameters                |      0 |           0 |
| information_schema      | VIEWS                     |      0 |           0 |
+-------------------------+---------------------------+--------+-------------+
59 rows in set (0.00 sec)

In_use的值为0,代表该表没有加过锁;值为1,代表该表已加锁

给mylock表上读锁(READ),给book表上写锁(WRITE)

LOCK TABLE mylock READ, book WRITE;
mysql> LOCK TABLE mylock READ, book WRITE;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW OPEN TABLES;
+-------------------------+---------------------------+--------+-------------+
| Database                | Table                     | In_use | Name_locked |
+-------------------------+---------------------------+--------+-------------+
| mysql                   | check_constraints         |      0 |           0 |
| mysql                   | column_type_elements      |      0 |           0 |
| advanced_mysql_learning | book                      |      1 |           0 |
| mysql                   | slave_master_info         |      0 |           0 |
| mysql                   | foreign_keys              |      0 |           0 |
| mysql                   | columns                   |      0 |           0 |
| mysql                   | foreign_key_column_usage  |      0 |           0 |
| mysql                   | server_cost               |      0 |           0 |
| mysql                   | index_column_usage        |      0 |           0 |
| mysql                   | view_table_usage          |      0 |           0 |
| mysql                   | index_partitions          |      0 |           0 |
| mysql                   | indexes                   |      0 |           0 |
| mysql                   | schemata                  |      0 |           0 |
| mysql                   | collations                |      0 |           0 |
| mysql                   | table_partition_values    |      0 |           0 |
| mysql                   | table_partitions          |      0 |           0 |
| mysql                   | tables                    |      0 |           0 |
| mysql                   | role_edges                |      0 |           0 |
| mysql                   | triggers                  |      0 |           0 |
| mysql                   | column_statistics         |      0 |           0 |
| mysql                   | view_routine_usage        |      0 |           0 |
| mysql                   | gtid_executed             |      0 |           0 |
| mysql                   | engine_cost               |      0 |           0 |
| mysql                   | component                 |      0 |           0 |
| mysql                   | user                      |      0 |           0 |
| mysql                   | db                        |      0 |           0 |
| mysql                   | tables_priv               |      0 |           0 |
| mysql                   | columns_priv              |      0 |           0 |
| performance_schema      | session_status            |      0 |           0 |
| mysql                   | procs_priv                |      0 |           0 |
| mysql                   | proxies_priv              |      0 |           0 |
| mysql                   | default_roles             |      0 |           0 |
| mysql                   | global_grants             |      0 |           0 |
| mysql                   | servers                   |      0 |           0 |
| mysql                   | password_history          |      0 |           0 |
| mysql                   | time_zone_transition      |      0 |           0 |
| mysql                   | time_zone_leap_second     |      0 |           0 |
| mysql                   | table_stats               |      0 |           0 |
| mysql                   | time_zone_name            |      0 |           0 |
| mysql                   | time_zone                 |      0 |           0 |
| advanced_mysql_learning | mylock                    |      1 |           0 |
| mysql                   | time_zone_transition_type |      0 |           0 |
| mysql                   | tablespace_files          |      0 |           0 |
| mysql                   | func                      |      0 |           0 |
| mysql                   | slave_relay_log_info      |      0 |           0 |
| information_schema      | TABLES                    |      0 |           0 |
| mysql                   | slave_worker_info         |      0 |           0 |
| mysql                   | routines                  |      0 |           0 |
| mysql                   | events                    |      0 |           0 |
| mysql                   | catalogs                  |      0 |           0 |
| information_schema      | SCHEMATA                  |      0 |           0 |
| mysql                   | character_sets            |      0 |           0 |
| advanced_mysql_learning | emp                       |      0 |           0 |
| mysql                   | tablespaces               |      0 |           0 |
| performance_schema      | session_variables         |      0 |           0 |
| information_schema      | COLUMNS                   |      0 |           0 |
| information_schema      | ROUTINES                  |      0 |           0 |
| information_schema      | PARAMETERS                |      0 |           0 |
| mysql                   | parameters                |      0 |           0 |
| information_schema      | VIEWS                     |      0 |           0 |
+-------------------------+---------------------------+--------+-------------+
60 rows in set (0.00 sec)

解开所有表的锁

UNLOCK TABLES;
读锁案例

打开两个会话,SESSION1mylock表添加读锁。

--  为mylock表添加读锁
LOCK TABLE mylock READ;

打开两个会话,SESSION1是否可以读自己锁的表?是否可以修改自己锁的表?是否可以读其他的表?那么SESSION2呢?

SESSION1

-- SESSION1为mylock表加了读锁之后可以读mylock表
mysql> SELECT * FROM `mylock`;
+----+----------+
| id | name     |
+----+----------+
|  1 | a        |
|  2 | b        |
|  3 | c        |
|  4 | d        |
|  5 | e        |
+----+----------+
4 rows in set (0.00 sec)

--  SESSION1为mylock表加了读锁之后,不支持修改mylock表
mysql> UPDATE `mylock` SET `name` = 'abc' WHERE `id` = 1;
ERROR 1099 (HY000): Table 'mylock' was locked with a READ lock and can't be updated

--  SESSION1为mylock表加了读锁,不可以读其他的表!
mysql> SELECT * FROM `book`;
ERROR 1100 (HY000): Table 'book' was not locked with LOCK TABLES

SESSION2

--  SESSION1为mylock表加了读锁,SESSION2可以读mylock表!
mysql> SELECT * FROM `mylock`;
+----+----------+
| id | name     |
+----+----------+
|  1 | a        |
|  2 | b        |
|  3 | c        |
|  4 | d        |
|  5 | e        |
+----+----------+
4 rows in set (0.00 sec)

--  SESSION1为mylock表加了读锁,SESSION2修改mylock表会被阻塞,需要等待SESSION1释放mylock表,才能执行语句
mysql> UPDATE `mylock` SET `name` = 'a' WHERE `id` = 10;
ERROR 1317 (70100): Query execution was interrupted

--  SESSION1为mylock表加了读锁,SESSION2可以读其他表
mysql> SELECT * FROM `book`;
+--------+------+
| bookid | card |
+--------+------+
|      1 |    1 |
|      7 |    4 |
|      8 |    4 |
|      9 |    5 |
|      5 |    6 |
|     17 |    6 |
|     15 |    8 |
+--------+------+
24 rows in set (0.00 sec)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaUAre2m-1687868884431)(assets/1687868819251-168.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8bPiWWc-1687868884432)(assets/1687868819251-169.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mYWD8Dt6-1687868884432)(assets/1687868819251-170.png)]

写锁案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ElB8YgRc-1687868884432)(assets/1687868819251-171.png)]

结论

**MyISAM**引擎

在执行查询语句**SELECT**之前,会自动给涉及到的所有表加读锁;

在执行增删改之前,会自动给涉及的表加写锁。

MySQL的表级锁有两种模式:

  • 表共享读锁(Table Read Lock)。
  • 表独占写锁(Table Write Lock)。

MyISAM表进行操作,会有以下情况:

  • MyISAM表的读操作(加读锁),不会阻塞其他线程(新建一个数据库连接就是其他线程)対同一表的读操作,但是会阻塞其他线程対同一表的写操作。只有当读锁释放之后,才会执行其他线程的写操作。
  • MyISAM表的写操作(加写锁),会阻塞其他线程対同一表的读和写操作,只有当写锁释放之后,才会执行其他线程的读写操作。

总结:读锁会阻塞写,但是不会阻塞读;写锁会把读和写都堵塞

表锁分析

如果有命令,可以知道锁了多长时间,锁的各种情况 ,就可以帮助我们更好地优化sql

查看哪些表被加锁

SHOW OPEN TABLES;
SHOW STATUS LIKE 'table%';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Table_locks_immediate      | 16    |
| Table_locks_waited         | 0     |
| Table_open_cache_hits      | 0     |
| Table_open_cache_misses    | 0     |
| Table_open_cache_overflows | 0     |
+----------------------------+-------+
5 rows in set (0.00 sec)

可以通过Table_locks_immediateTable_locks_waited两个状态变量记录Mysql内部表级锁定的情况,具体说明如下:

Table_locks_immediate:产生表级锁定的次数,表示可以立即获取锁的查询次数,每立即获取锁值加1。

Table_locks_waited:出现表级锁定争用而发生等待的次数(不能立即获取锁的次数,每等待一次锁值加1),此值高则说明存在较严重的表级锁争用情况

**此外,****MyISAM的读写锁调度是写优先,这也是MyISAM**不适合作写为主表的引擎。因为写锁后,其他线程不能进行任何操作,大量的写操作会使查询很难得到锁,从而造成永远阻塞。

行锁(偏写)

偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

**InnoDB存储引擎和MyISAM**存储引擎最大不同有两点:一是支持事务,二是采用行锁。

事务 (Transaction)及其ACID属性

事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性,通常简称为事务的ACID属性

  • 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
  • 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时所有的内部数据结构(如B树案引或双向链表)也都必须是正确的。
  • 隔离性(lsolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发作影响的”独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
  • 持久性 ( Durable ): 事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
并发事务处理带来的影响
  • 更新丢失:当两个或多个事各选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题一一最后的更新覆盖了由其他事务所做的更新。例如,两个程序员修改同一java文件。每程序员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文档。最后保存其更改副本的编辑人员覆盖前一个程序员所做的更改。如果在一个程序员完成并提交事务之前,另一个程序员不能访问同一文件,则可避免此问题。
  • 脏读:一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做”脏读”。一句话:事务A读取到了事务B已修改但尚未提交的的数据,还在这个数据基础上做了操作。此时,如果B事务回滚,A读取的数据无效,不符合一致性要求。
  • 不可重复读:一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除!这种现象就叫做“不可重复读”。一句话:事务A读取到了事务B已经提交的修改数据,不符合隔离性。
  • 幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。一句话: 事务A读取到了事务B提交的新增数据,不符合隔离性。多说一句:幻读和脏读有点类似,脏读是事务B里面修改了数据,幻读是事务B里面新增了数据
事务的隔离级别

“脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性可题,必须由数据库提供一定的事务隔离机制来解决。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZtAsjVif-1687868884432)(assets/1687868819251-172.png)]

数据库的事务隔离越严格,并发副作用越小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上“串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏感,可能更关心数据并发访问的能力。

查看当前数据库的事务隔离级别

mysql> show variables like 'tx_isolation';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUMGVF4j-1687868884432)(assets/1687868819251-173.png)]

"可重复读"是数据库的默认隔离级别,可以避免脏读不可重复读,不可以避免幻读

行锁演示
建表sql
# 建表语句
CREATE TABLE `test_innodb_lock`(
`a` INT,
`b` VARCHAR(16)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='测试行锁'; 

# 插入数据
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(1, 'b2');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(3, '3');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(4, '4000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(5, '5000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(6, '6000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(7, '7000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(8, '8000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(9, '9000');
INSERT INTO `test_innodb_lock`(`a`, `b`) VALUES(1, 'b1');

# 创建索引
CREATE INDEX test_innodb_a_ind ON `test_innodb_lock`(a);
CREATE INDEX test_innodb_lock_b_ind ON `test_innodb_lock`(b);
mysql> select * from test_innodb_lock;
+------+------+
| a    | b    |
+------+------+
|    1 | b2   |
|    3 | 3    |
|    4 | 4000 |
|    5 | 5000 |
|    6 | 6000 |
|    7 | 7000 |
|    8 | 8000 |
|    9 | 9000 |
|    1 | b1   |
+------+------+
9 rows in set (0.00 sec)
行锁案例

开启手动提交

创建两个会话,两个会话都开启手动提交。

--  开启MySQL数据库的手动提交,取消自动提交
mysql> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)

读己知所写

大的系统都是分布式,数据强一致性和高并发不能同时满足,比如自己发个微博,可能别人要一两秒之后才可以看到,但是自己肯定第一时间就可以看到,故“读己知所写”

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

两个会话同时对一条记录进行修改

在这里插入图片描述

在这里插入图片描述

两个会话同时对不同记录进行修改

在这里插入图片描述

索引失效行锁变表锁

在这里插入图片描述

行锁变成表锁会导致系统变慢

间隙锁的危害

在这里插入图片描述

什么是间隙锁?

当我们用范围条件而不是相等条件检索数据,并请求共享或者排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁,对于键值在条件范围内但并不存在的记录,叫做"间隙(GAP)"。

InnoDB也会对这个"间隙"加锁,这种锁的机制就是所谓的"间隙锁"。

间隙锁的危害

因为Query执行过程中通过范围查找的话,他会锁定整个范围内所有的索引键值,即使这个键值不存在。

间隙锁有一个比较致命的缺点,就是当锁定一个范围的键值后,即使某些不存在的键值也会被无辜的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。某些场景下这可能会対性能造成很大的危害

如何锁定一行

在这里插入图片描述

在这里插入图片描述

行锁分析
mysql> SHOW STATUS LIKE 'innodb_row_lock%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| Innodb_row_lock_current_waits | 0     |
| Innodb_row_lock_time          | 0     |
| Innodb_row_lock_time_avg      | 0     |
| Innodb_row_lock_time_max      | 0     |
| Innodb_row_lock_waits         | 0     |
+-------------------------------+-------+
5 rows in set (0.00 sec)

対各个状态量的说明如下:

  • Innodb_row_lock_current_waits:当前正在等待锁定的数量。
  • Innodb_row_lock_time:从系统启动到现在锁定总时间长度(等待总时长)。
  • Innodb_row_lock_time_avg:每次等待所花的平均时间(等待平均时长)。
  • Innodb_row_lock_time_max:从系统启动到现在等待最长的一次所花的时间。
  • Innodb_row_lock_waits:系统启动后到现在总共等待的次数(等待总次数)。

当等待次数很高,而且每次等待时长也不小的时候,我们就需要分析系统中为什么会有如此多的等待,然后根据分析结果着手制定优化策略。

案例结论

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面所带来的性能损耗可能比表级锁定会要更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表级锁定的。当系统并发量较高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势了。

但是,InnoDB的行级锁定同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差。

页锁

开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般(了解一下即可)

优化建议

  • 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
  • 合理设计索引,尽量缩小锁的范围
  • 尽可能减少检索条件,避免间隙锁
  • 尽量控制事务大小,减少锁定资源量和时间长度
  • 尽可能使用低级别事务隔离

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue-cli笔记

vue的生命周期: 借鉴react 钩子函数: change() 挂载完毕,vue完成模板解析,并把初始的真实的dom元素放入到页面后执行 beforeCreate() {// 数据代理和数据监测创建之前console.log(beforeCreate) }, created() {console.l…

深度:全面解析数据智能的金融“炼金术”!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 金融以其财富效应,成为最新科技的试金石。一项新技术出来后,人们首先闪过的念头就是“能不能用它赚钱”。例如,ChatGPT带火了大模型,人们也开始将目标聚焦到大模型在金融领域的…

【实战】 JWT、用户认证与异步请求(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(五)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求1~56.用useAuth切换登录与非登录状态7.用fetch抽象通用HTTP请求方法,增强通用性8.用useHt…

AR宇航员互动体验软件:虚拟与现实叠加增强体验感

随着科技的不断发展,人们对太空探索的兴趣和热情也越来越高涨。为了满足人们对太空探索的渴望,广州华锐互动研发了宇航员AR模拟体验软件,这种软件可以让用户身临其境地体验太空探索的过程,提供一种全新的、令人兴奋的太空探索新体…

css基础知识十一:CSS3新增了哪些新特性?

一、是什么 css,即层叠样式表(Cascading Style Sheets)的简称,是一种标记语言,由浏览器解释执行用来使页面变得更为美观 css3是css的最新标准,是向后兼容的,CSS1/2的特性在CSS3 里都是可以使用…

图解CNN中的卷积(卷积运算、池化、Padding、多通道的卷积)

文章目录 卷积操作池化Padding对多通道(channels)图片的卷积套上激活函数是什么样的参考: 卷积层是深度学习神经网络中经常使用的一种层。它通过卷积运算来提取输入的特征,常用于图像、语音等信号处理任务中。 卷积层有以下几个参…

rocketmq-spring-boot-starter支持SpringBoot 1.x(spring-context 4.x)版本

1 问题说明 由于历史原因,项目使用的是SpringBoot1.x版本,而且由于种种原因,不能升级。在项目开发迭代过程中,决定使用RocketMQ作为消息中间件,因为是SpringBoot项目,理所应当的引入了rocketmq-spring-boo…

简单聊聊数字孪生与GIS融合的必要性

随着科技的不断发展和应用的不断深入,数字孪生和GIS在各自领域中展现出巨大的潜力。然而,更引人注目的是,数字孪生和GIS的融合将为许多行业带来全新的机遇和变革。在本文中,我们将探讨数字孪生和GIS融合的必要性,以及它…

2023ty计网期末综合题满分冲刺版

1. 假设有段1km长的CSMA/CD网络链路的数据传输率为1Gb/s。设信号在此链路媒介上的传播速度为2x105 km/s,求使用此协议的最短数据帧长度。 (1)传播时延:1/2000005微秒, (2)往返时延&#xff1a…

List合并的操作

List合并的操作 1.addAll方法 List list1new ArrayList();List list2new ArrayList();for (int i 0; i < 10; i) {list1.add(i*2);list2.add(i*21);}System.out.println(list1);//方法1&#xff1a;addAlllist1.addAll(list2);System.out.println(list1); 2.Stream操作 L…

ATTCK(二)之ATTCK的发展历史

ATT&CK的发展历史 MITRE公司 MITRE是美国NIST标准化组织选择的专注于网络安全的组织&#xff0c;由美国联邦政府资助。很多安全标准都MITRE制定的&#xff0c;比如有名的漏洞CVE编号规则以及威胁情报格式STIX。所以ATT&CK非常有影响力&#xff0c;而且未来能成为一个公…

MySQL----MHA高可用

文章目录 一、MHA理论1.1什么是 MHA1.2MHA 的组成1.3MHA 的特点 二、MHA的一主两从部署实验设计故障修复步骤&#xff1a; 一、MHA理论 1.1什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出…

Java 日志重点梳理

大家好&#xff01;我是今越。重点梳理一下在 Java 程序开发中关于日志管理的知识点&#xff0c;以及在 Spring Boot 框架中该如何使用日志。 在 Java 中&#xff0c;日志框架主要分为两大类&#xff1a;日志门面和日志实现。 日志门面 日志门面定义了一组日志的接口规范&am…

LangChain-Agent自定义Tools类 ——输入参数篇(二)

给自定义函数传入输入参数&#xff0c;分别有single-input 参数函数案例和multi-input 参数函数案例&#xff1a; from langchain.agents import Tool from langchain.tools import BaseTool from math import pi from typing import Union from math import pi from typing …

StringBuffer和正则表达式

StringBuffe 获取int类型的最大值和最小值 System.out.println(Integer.MAX_VALUE);//int类型的最大值 System.out.println(Integer.MIN_VALUE);//int类型的最小值输出结果 Integer和String相互转换 Integer i1 new Integer(100); System.out.println(i1);Integer i2 new…

08 | 事务到底是隔离的还是不隔离的?

以下内容出自《MySQL 实战 45 讲》 08 | 事务到底是隔离的还是不隔离的&#xff1f; 事务启动时机 事务启动时机&#xff1a; begin/start transaction 命令并不是一个事务的起点&#xff0c;在执行到它们之后的第一个操作 InnoDB 表的语句&#xff0c;事务才真正启动。如果想…

Gradio的Button组件介绍

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

从0到1精通自动化测试,pytest自动化测试框架,配置文件pytest.ini(十三)

一、前言 pytest配置文件可以改变pytest的运行方式&#xff0c;它是一个固定的文件pytest.ini文件&#xff0c;读取配置信息&#xff0c;按指定的方式去运行 二、ini配置文件 pytest里面有些文件是非test文件pytest.ini pytest的主配置文件&#xff0c;可以改变pytest的默认…

SpringBoot多环境启动

文章目录 多环境启动多环境启动基本格式多环境启动命令格式多环境启动的兼容性 多环境启动 多环境启动基本格式 我们在开发中和上线后的环境中, 有些配置文件的值是不相同的, 但是当项目上线后我们肯定是不能修改配置文件的, 于是我们需要针对不同的环境进行不同的配置 例如下…

【C语言之区分sizeof 和 strlen】

C语言之区分sizeof 和 strlen 详解C语言sizeof 和 strlen1、单目操作符1.1、详解sizeof单目操作符1.2、sizeof代码部分1.2.1、sizeof例程11.2.2、sizeof例程21.2.3、sizeof例程3 2、详解strlen函数2.1、strlen代码部分2.1.1、strlen例程1 3、区别strlen函数和sizeof操作符3.1、…