Mysql锁机制介绍

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.mfbz.cn/a/34384.html

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

相关文章

docker部署rabbitmq

拉取镜像 我部署的是3.8版本的 docker pull rabbitmq:3.8 启动容器 docker run -d --hostname my-rabbit --name rabbitmq --restart always -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASSadmin -p 15672:15672 -p 5672:5672 --privilegedtrue rabbitmq:3.8 启…

【Verilog HDL】FPGA-testbench基础知识

🎉欢迎来到FPGA专栏~testbench基础知识 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能…

【网络原理之一】应用层协议、传输层协议UDP和TCP,TCP的三次握手和四次挥手以及TCP的可靠和效率机制

应用层协议XML协议JSONHTTP 传输层协议UDP协议UDP的特点UDP协议格式 TCP协议TCP的特点TCP协议格式TCP的安全和效率机制确认应答(可靠机制)超时重传(可靠机制)连接管理(可靠机制)三次握手(连接过程)四次挥手(断开的过程)状态的转化 滑动窗口(效率机制)流量控制(可靠机制)拥塞控制…

【码银送书第一期】通用人工智能:初心与未来

目录 前言 正文 内容简介 作者简介 译者简介 目录 前言 自20世纪50年代图灵在其划时代论文《计算机器与智能》中提出“图灵测试”以及之后的达特茅斯研讨会开始,用机器来模仿人类学习及其他方面的智能,即实现“人工智能”(Artificial …

最优化问题matlab求解-fminsearch()和fmincon()函数的使用

matlab可以求解无约束最优化问题、有约束最优化问题和线性规划、二次型规划问题等,同时实现了最小二乘法的曲线拟合方法。matlab求解优化问题的步骤为: 写标准型描述目标函数:M-函数或匿名函数用fminunc()或fmincon()等函数求解原问题。检验…

【从删库到跑路】MySQL系列——详细讲解SQL的DDL,DML,DQL,DCL语句

🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【如愿】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 文章目录 🍔关系型数据库⭐概念⭐特点 🍔MySQL数…

开发工具-网络测试工具 POSTMAN 的脚本使用

开发工具-网络测试工具 POSTMAN 的脚本使用 postman 脚本应用基础设置变量、获取变量示例环境变量的使用测试 发送请求示例常用的变量、方法responseBody 获取响应体内容pm.response 获取响应信息pm.expect() JSON检查cheerio.load() 类似于 jquery 操作 html 元素 POSTMAN 是网…

RabbitMQ入门指南

人生永没有终点。只有等到你瞑目的那一刻,才能说你走完了人生路,在此之前,新的第一次始终有,新的挑战依然在,新的感悟不断涌现。 文章目录 一、MQ与RabbitMQ概述1. MQ简述2. MQ的优势3. MQ的劣势4. 常见的MQ产品5. Rab…

MySQL 数据库

文章目录 数据库的基本概念数据表数据库数据库管理系统数据库系统 数据库的发展史当今主流数据库介绍SQL Server (微软公司产品)Oracle (甲骨文公司产品)DB2 (IBM公司产品)MySQL (甲骨文公司收购…

Spring Boot日志文件

目录 前言🍭 一、日志的作用🍭 1、日志真实使用案例:🍉 二、日志怎么用🍭 1、自定义日志打印🍉 Ⅰ、在程序中得到日志对象🍓 常见的日志框架说明(了解)&#x1f35…

保姆级AT32F437 配置RT-Thread 以太网(UDP/TCP Server)

好记性不如烂笔头,既然不够聪明,就乖乖的做笔记,温故而知新。 本文档用于本人对知识点的梳理和记录。 一、前言 ENV版本:v1.3.5 rt-thread版本:V5 开发板:雅特力AT32F437 AT-START-F437 二、ENV配置 E…

java--类变量与实例变量--实验设计--村庄种树

目录 设计要求 设计流程图 程序代码 类Village代码 类MainClass代码 可以直接运行的代码 运行结果 类变量与实例变量的区别和类方法与实例方法的区别 idea的详细使用方法 设计要求 编写程序模拟两个村庄共同拥有一片森林;编写一个Village类,该类…

python爬虫:爬取网站所有页面上某些内容

举例场景:爬取腾讯课堂中,查询python的所有课程的封面图、课程标题、课程数量、课程价格,这4个部分的内容。 代码如下: import requests # import lxml # 导入用于请求的包lxml from bs4 import BeautifulSoup # 导入用于请求…

Tomcat 8.5 环境搭建指南

文章目录 导言环境搭建总结 导言 欢迎阅读本篇博客,本文将为您提供关于如何搭建Tomcat 8.5环境的详细指南。Tomcat是一个流行的开源Java Servlet容器,它提供了一个运行Java Web应用程序的平台。无论您是新手还是有经验的开发人员,本文都将帮…

4、架构:Canvas VS DOM

在可视化搭建的低代码平台中,设计器是一个非常关键的模块,可以帮助用户通过拖拽、配置等方式快速搭建应用界面。 在技术选型方面,目前市面上主流的设计器技术包括基于 HTML/CSS/JavaScript 的 Web 设计器。 在渲染方案方面,主流…

王道《计算机网络》思维导图汇总

第一章 1.1.1 概念与功能 1.1.2 组成与分类 1.1.3 标准化工作及相关组织 1.1.4 性能指标 速率 带宽 吞吐量 时延 时延带宽积 往返时延RTT 利用率 1.2.1 分层结构、协议、接口、服务 1.2.2 OSI参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 1.2.4 TCP/IP 参…

Linux下的分布式迁移工具dsync使用

一、Linux下的分布式迁移工具dsync使用 dsync 是一个在 Linux 系统上用于迁移文件和目录的工具。它可以在不同的存储设备之间进行数据同步和迁移操作。dsync 是 rsync 工具的一个衍生版本,专注于在本地文件系统之间进行数据迁移。 这里是官网:dsync 1、…

游泳买耳机买什么的比较好,列举几款实战性好的游泳耳机

对于运动用户来说,在运动时都会选择听一些节奏感比较强的音乐,让自己运动是更有活力。现在已经是三伏天中的前伏期间,不少人会选择在三伏天的日子里进行减肥瘦身,耳游泳已经成为很多人都首选运动,游泳是非常好的有氧运…

吐血整理!可免费使用的国产良心软件分享,几乎满足你办公需求

在这个信息化时代,软件已经成为我们办公和生活的必备工具。然而,市面上的大部分国产软件都需要付费才能使用,给我们的经济负担增加了不少。幸运的是,国内有一些良心软件,它们质量上乘,功能强大,…

2023牛客网秋招国内大厂最牛的 Java 面试八股文合集(全彩版)

秋收即将来临,找工作的小伙伴比比皆是,很对小伙伴早早的就开始储备技术,准备秋招面试了。 为了帮助小伙伴更好的应对面试,我拉来十几个大佬,汇总一线大厂的情况,给你整了一套超全的面试资料: 16…
最新文章