当前位置: 首页 > news >正文

说一说MySQL中的锁机制

说一说MySQL中的锁机制

按粒度大小从大到小分为 全局锁

全局锁

全局锁是对整个数据库的锁,最常用的全局锁就是读写锁

  • 读锁 阻止其他用户更新数据,允许其他用户读数据
  • 写锁 阻止其他用户更新和读数据 修改一些大量的数据,并且不希望其他用户在这段时间内干扰时很有用

flush tables with read lock

unlock tables

全局锁的典型应用场景是,进行一些需要确保整个数据库一致性的操作,比如全库的备份和导出等。

表级锁

Q :什么是表级锁

表级锁是MySQL中最基本的锁策略,是MySQL最早采用的锁策略。表级锁的特点是开销小,加锁快,不会出现死锁。

锁的力度大,发生锁冲突的概率最高,并发度最低

表锁有两种模式:

  • 表共享读锁(Table Read Lock):又称为表读锁,允许一个事务锁定的表进行读取操作,不允许其他事物对这个表进行写操作。读锁之间是不会相互阻塞的。
  • 表独占写锁(Table Write Lock):又称为表写锁,允许一个事物锁定的表进行读取和写入(更新)操作,但是其他任何事物都不能再对这个表进行任何操作,必须等待表写锁结束。写锁会阻塞其他所有锁,包括读锁和写锁

在MySQL中,InnoDB引擎在必要情况下会使用表锁,但主要是使用行锁来实现多版本并发控制(mvcc),它能提供更好的并发性能和更少的锁冲突

总的来说,表锁适用于读操作多、写操作少且并发争用不是很激烈的情况。在并发度高,或者写操作较多的情况下,表锁可能会成为瓶颈

Q:表级锁有哪些适用场景

  • 读密集型应用:如果你对应用主要进行读取操作,很少进行写入操作,那么使用标记锁可能是一个好选择。因为标记杜所不会则色其他的读锁,所以这种场景下表级锁能够提供很高的性能
  • 写操作不频繁的场景:表级锁对写操作的处理并不高效,因为一个写锁会阻塞其他所有的锁,无论它们是读锁还是写锁,但是,如果你的应用不需要频繁地进行写操作,或者可以容忍写操作的延迟,那么使用表级锁是可行的
  • 全表更新或删除:在某些情况下,可能需要对一张表进行全表的更新或删除操作,例如,删除表中的所有记录,或者更新表中所有记录的某个字段的值,在这种情况下,使用表级锁是合适的
  • 数据量不大的简单应用:如果数据库的数据量不大,那么即使在写操作中,由于缩影整张表,对性能影响不大

但要注意,虽然表级锁的开销较小,但由于其锁定粒度大,会导致并发度下降,特别是在写操作频繁场景下,使用行锁更为合适

Q:哪些命令发生表锁?

  1. alter table
  2. drop table 、truncate table
  3. lock tables
  4. 全表扫描
  5. flush tables with read lock

Q:MySQL表锁风险点

  • 性能下降
  • 并发性能差
  • 可能导致锁等待和超时
  • 写操作影响大
  • 可能导致死锁:虽然表锁本身不会出现死锁,但在多表操作中,如果没有按照一定的顺序获得锁,可能会导致死锁

行锁

Q:什么是行锁?

行级锁是MySQL中的一种锁定机制,他可以对数据库表中的单独一行进行锁定,相比于表级锁和页锁,行级锁的粒度更小,因此在处理高并发事务时,能够提供更好的并发性能和更少的所冲突。然而,行级锁也需要更多的内存和CPU资源,因为需要对每一行进行管理

在MySQL中,行级锁主要由InnoDB存储引擎提供。InnoDB支持两种类型的行锁:共享锁(S锁)和排他锁(X锁)

  • 共享锁(S锁):共享锁也称为读锁,它允许一个事务读取一行数据。当一行数据被共享锁锁定时,其他事务可以读取这行数据,但不能对其进行修改
  • 排它锁(X锁):排它锁也称为写锁,它允许一个事务读取和修改一行数据。当一行数据被排它锁锁定时,其他事务不能读取也不能修改这行数据。

在实际使用中,InnoDB还提供了一种名为"间隙锁"(Gap Lock)的特性。间隙锁不仅锁定一个具体的行,还锁定它前后的间隙,即这一行之前的行和之后的行之间的空间。间隙锁可以防止其他事务插入新的行到已锁定行的前后,从而可以解决一些并发问题

值得注意的是,行级锁只在事务中有效,也就是说,只有在一个事务开始(BEGIN)后并在事务提交(COMMIT) 或回滚(ROLLBACK) 之前,才能对数据行进行锁定。如果在非事务环境中执行SQL语句,那么InnoDB会在语句执行结束后立即释放所有的锁

Q:MySQL行锁有哪些适用场景

MySQL的行级锁(Row Level Locks)通常在以下几种场景中被使用:

  • 高并发读写操作:在需要高并发读写操作的场景中,行级锁可以提高性能,因为它允许多个实物并发地操作不同的行
  • 单行操作:对于需要操作单行数据的SQL语句(例如基于主键或唯一索引的UPDATE、DELETE和INSERT语句),行级锁可以提供较好的并发性和性能
  • 短期锁:在需要对数据行进行短时间锁定的情况下,行级锁可以防止长时间阻塞其他事务
  • 实现并发控制:在需要确保数据一致性和隔离性的事务中,行级锁是实现并发控制的重要机制
  • 复杂的事务处理

使用行级锁需要注意,由于行级锁的锁定粒度小,它会消耗更多的系统资源,特别是处理大量数据时。此外,使用行级锁也可能导致死锁

MySQL中哪些命令会发生行锁

  • SELECT … FOR UPDATE :这种查询会对选定的行添加X锁(排它锁),这意味其他事务不能修改这些行,也不能加S锁
  • SELECT … LOCK IN SHARE MODE :会加S锁
  • INSERT:插入操作会对新添加的行添加一个X锁
  • UPDATE:更新操作会对被更新的行添加一个X锁
  • DELETE:删除操作会对被删除的行添加一个X锁

Q:MySQL行锁有什么风险点

尽管行级锁可以提供高并发性并减少锁冲突,但在使用过程中也可能遇到一些风险和问题

  • 死锁
  • 锁升级:如果一个事务视图锁定的行过多,InnoDB肯呢个会将锁从行级升级为表级
  • 锁等待
  • 资源消耗
  • 难以调试和排查
  • 事务隔离级别

乐观锁和悲观锁

Q:什么是乐观锁

乐观锁是一种并发控制机制,它的核心思想是乐观地认为数据不会发生冲突,因此在大部分时间里不对数据进行加锁,而是在更新数据时检查数据是否被其他事务修改过。乐观锁通常适用于并发写入较少的场景,可以提高系统的并发性能。

在实现乐观锁时,一般会引入版本号(Version)或时间戳(Timestamp)等字段来标识数据的版本信息。当一个事务要更新数据时,首先会读取数据的版本信息,然后在写入数据时将版本信息一起提交。在提交时,系统会检查提交的版本信息与当前数据库中的版本信息是否一致,如果一致则表示数据未被其他事务修改,允许更新;如果不一致则表示数据已经被其他事务修改,此时需要根据具体业务场景选择合适的处理方式,比如放弃更新、重新读取数据后再次尝试更新等。

乐观锁的优点是不会引入额外的锁竞争,适用于读多写少的场景,并且可以减少数据库锁的使用,提高系统的并发性能。但是乐观锁也有一些缺点,比如在并发写入较多的场景下可能会导致更新冲突的频率较高,需要进行重试等,这会增加系统的复杂度。

总的来说,乐观锁在合适的场景下可以提供良好的性能和并发控制效果,但在具体应用时需要根据业务场景和性能需求进行综合考量。

Q:什么是悲观锁

悲观锁是一种并发控制机制,它的核心思想是在对数据进行操作之前先获取锁,以确保数据操作的独占性。悲观锁通常适用于并发写入较多的场景,通过加锁来避免数据的并发修改,确保数据的一致性。

在实现悲观锁时,一般会使用数据库提供的锁机制,比如行级锁或表级锁。当一个事务要对数据进行操作时,会先获取相应的锁,其他事务需要等待该锁释放后才能对数据进行操作。悲观锁的典型代表是数据库中的SELECT … FOR UPDATE语句,它可以在读取数据的同时给数据行加上排他锁,阻止其他事务对该数据行进行修改。

悲观锁的优点是能够确保数据的一致性,避免了数据的并发修改,适用于高并发写入的场景。但是悲观锁也有一些缺点,比如可能会引起锁竞争和死锁问题,降低系统的并发性能;另外,长时间持有锁也会影响系统的吞吐量。

总的来说,悲观锁适用于对数据一致性要求较高的场景,但需要注意合理使用锁粒度和锁持有的时间,避免锁竞争和性能问题。在具体应用时,需要根据业务场景和性能需求进行综合考量,选择合适的并发控制策略。

Q:两种锁有哪些适用场景?

乐观锁适用于以下场景:

  1. 读多写少的场景:当系统中对数据的读操作远远多于写操作时,乐观锁可以有效地提高并发性能,因为大部分情况下数据不会发生冲突,无需频繁加锁。
  2. 数据冲突较少的场景:在业务逻辑上能够预测到数据冲突的概率较低的情况下,乐观锁可以减少加锁等待的时间,提高系统的吞吐量。
  3. 版本化控制:乐观锁通常会使用版本号或时间戳等方式来标识数据的版本信息,适用于需要对数据进行版本化控制的场景。

MyBatisPlus有乐观锁插件,在表字段中加入Version字段

@Version
@TableField(value = "version")@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}
}

悲观锁适用于以下场景:

  1. 高并发写入的场景:当系统中对数据的写操作非常频繁时,为了确保数据的一致性和避免并发修改带来的问题,使用悲观锁可以有效地控制并发写入。
  2. 对数据一致性要求较高的场景:在某些业务场景下,对数据的一致性要求非常严格,不能容忍数据的并发修改或脏读现象,这时悲观锁可以提供有效的并发控制。
  3. 长事务场景:在需要长时间持有数据锁的业务操作中,使用悲观锁可以确保数据的独占性,避免其他事务的干扰。

总的来说,乐观锁适合于读多写少、数据冲突较少的场景,可以提高系统的并发性能;而悲观锁适合于高并发写入、数据一致性要求高以及长事务场景,可以确保数据的一致性和独占性。在实际应用中,需要根据具体业务场景和性能需求选择合适的并发控制策略。

SELECT ... FOR UPDATE #排它锁 不可读不可更新SELECT ... LOCK IN SHARE MODE #共享锁 可读不可更新

悲观锁虽然能够确保数据的一致性和避免并发修改的问题,但是它也存在一些缺点,包括:

  1. 性能影响:悲观锁在数据库层面对数据进行加锁,会导致其他事务在需要访问相同数据时被阻塞,从而降低系统的并发性能。
  2. 死锁风险:使用悲观锁时,如果事务在持有锁的过程中因为等待其他资源而被阻塞,可能会出现死锁的情况,导致系统无法继续进行下去。
  3. 资源占用:悲观锁通常需要在事务开始时就对数据进行加锁,并且在事务结束时才释放锁,这可能会导致对数据库资源的长时间占用,影响整体系统的吞吐量。
  4. 编程复杂性:使用悲观锁需要开发者自行管理锁的获取和释放,编写复杂,容易出现错误,并且增加了代码的复杂性和维护成本。

基于以上缺点,开发者在使用悲观锁时需要谨慎考虑,并且根据具体的业务场景和并发需求选择合适的并发控制策略。在一些情况下,可以考虑使用乐观锁、分布式锁等替代方案来解决并发控制的问题,以减少悲观锁所带来的性能和复杂性开销。

意向锁

  • 在使用 InnoDB 引擎的表里对某些记录加上「共享锁」之前,需要先在表级别加上一个「意向共享锁」;
  • 在使用 InnoDB 引擎的表里对某些纪录加上「独占锁」之前,需要先在表级别加上一个「意向独占锁」;

也就是,当执行插入、更新、删除操作,需要先对表加上「意向独占锁」,然后对该记录加独占锁。

而普通的 select 是不会加行级锁的,普通的 select 语句是利用 MVCC 实现一致性读,是无锁的。

不过,select 也是可以对记录加共享锁和独占锁的,具体方式如下:

//先在表上加上意向共享锁,然后对读取的记录加共享锁
select ... lock in share mode;//先表上加上意向独占锁,然后对读取的记录加独占锁
select ... for update;

意向共享锁和意向独占锁是表级锁,不会和行级的共享锁和独占锁发生冲突,而且意向锁之间也不会发生冲突,只会和共享表锁(*lock tables … read*)和独占表锁(*lock tables … write*)发生冲突。

表锁和行锁是满足读读共享、读写互斥、写写互斥的。

如果没有「意向锁」,那么加「独占表锁」时,就需要遍历表里所有记录,查看是否有记录存在独占锁,这样效率会很慢。

那么有了「意向锁」,由于在对记录加独占锁前,先会加上表级别的意向独占锁,那么在加「独占表锁」时,直接查该表是否有意向独占锁,如果有就意味着表里已经有记录被加了独占锁,这样就不用去遍历表里的记录。

所以,意向锁的目的是为了快速判断表里是否有记录被加锁

就是,当我对整个表加锁时,lock tables your_table write,我不需要逐行判断是否加了行锁,因为表上又意向排它锁,直接互斥。

但是,共享锁和意向共享锁是不互斥的,都是读,读读不互斥。

临键锁(Next-Key Lock)

Q: 什么是临键锁?

Next-Key 可以理解为一种特殊的间隙锁,也可以理解为一种特殊的算法。通过临键锁可以解决幻读问题。每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事物持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。需要强调的是,InnoDB中行级锁时基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列上不存在临键锁

age在(24,32]会锁住,当我们尝试:

就会阻塞,直到事务提交。

记录锁

在MySQL中,当一个事务对数据行进行修改时,会对这些数据行进行加锁,以确保操作的原子性和一致性。这种锁被称为记录锁(Record Lock)。记录锁是一种悲观锁,用于在事务中对数据行进行读取和修改时保护数据的完整性。

记录锁在MySQL中的工作方式如下:

  1. 当一个事务对某些数据行进行读取并希望在后续操作中修改这些行时,会为这些数据行添加记录锁。
  2. 如果另一个事务尝试对已被记录锁保护的数据行进行修改,那么该事务会被阻塞,直到持有记录锁的事务释放锁。
  3. 事务提交或回滚后,记录锁会自动释放。

需要注意的是,MySQL中的记录锁是基于行级别的,因此只会锁定涉及到的具体数据行,而不会锁定整个数据表。这样可以最大程度地减少并发操作的冲突,但也可能会导致大量的锁竞争和死锁问题,因此在使用记录锁时需要谨慎考虑并发访问的情况。

总之,记录锁是MySQL中用于保护数据行完整性的重要机制,但在实际应用中需要注意合理使用,避免造成性能问题和并发冲突。

间隙锁

在 MySQL 中,间隙锁(Gap Lock)是一种特殊的锁类型,用于防止其他事务在一个范围内插入新的记录,从而保证范围查询的一致性。间隙锁通常用于解决幻读(Phantom Read)的问题。

当一个事务执行范围查询(例如使用范围条件的 SELECT 语句)时,MySQL 可能会使用间隙锁来锁定范围内的间隙,而不仅仅是已经存在的行。这样做可以防止其他事务在这个范围内插入新的记录,确保了范围查询的一致性。

举个例子,如果一个事务执行如下的范围查询语句:

sqlCopy CodeSELECT * FROM your_table WHERE id > 100 FOR UPDATE;

那么MySQL可能会使用间隙锁来锁定所有 id 大于 100 的间隙,防止其他事务在这个范围内插入新的记录。这样可以避免在后续操作中出现新的符合范围条件的记录,导致幻读的问题。

需要注意的是,间隙锁可能会导致一些性能上的影响,因为它会在范围查询时锁定额外的间隙。因此,在使用范围查询和间隙锁时需要谨慎考虑,并确保它们符合业务需求。

总之,间隙锁在 MySQL 中是用来保证范围查询一致性的重要机制,但在实际应用中需要注意潜在的性能影响,并结合具体业务场景合理选择使用。

Q:间隙锁在哪里遇到过?

  • 范围查询:在执行范围查询时,如果事务需要对查询结果进行更新或删除,那么间隙锁可以保证在事务执行期间,不会有新的行插入到范围查询中。
  • 防止幻读:间隙锁的主要目的是防止其他事务在已经锁定的范围内插入新的行。这可以避免幻读问题。
  1. 性能影响:间隙锁可能导致范围查询的性能下降,因为它会在范围查询时额外锁定一些间隙,增加了锁竞争和并发访问的复杂度。这可能对系统的吞吐量和响应时间产生负面影响。
  2. 死锁风险:由于间隙锁的存在,事务之间可能会出现死锁的情况。特别是当多个事务同时操作同一个范围内的数据时,由于对间隙的锁定,可能会引发死锁,需要通过合理的事务设计和锁定策略来避免这种情况。
  3. 幻读问题:间隙锁的引入可以避免幻读(Phantom Read)问题,但在某些情况下,也可能会由于间隙锁的存在导致本不必要的范围查询失败,从而影响业务逻辑的正确性。
  4. 锁竞争:在高并发环境下,间隙锁可能会增加锁竞争的激烈程度,降低系统的并发性能,需要特别关注和优化。

综上所述,间隙锁在 MySQL 中的使用需要谨慎权衡,尤其是在高并发、大数据量的场景下,需要仔细评估其带来的潜在问题,并采取相应的优化措施来减轻其可能的负面影响。

相关文章:

说一说MySQL中的锁机制

说一说MySQL中的锁机制 按粒度大小从大到小分为 全局锁 全局锁 全局锁是对整个数据库的锁,最常用的全局锁就是读写锁 读锁 阻止其他用户更新数据,允许其他用户读数据写锁 阻止其他用户更新和读数据 修改一些大量的数据,并且不希望其他用户…...

C++笔试训练day_1

文章目录 选择题编程题 选择题 编程题 #include <iostream> #include <algorithm> #include <vector>using namespace std;int main() {int n 0;cin >> n;vector<int> v;v.resize(3 * n);int x 0;for(int i 0; i < v.size(); i){cin >&…...

详解Spring对Mybatis等持久化框架的整合

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…...

[Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包

​ 在使用 electron-packager 工具输出 linux 平台的 electron app 后&#xff0c;可以使用 electron-installer-debian 工具把 app 打包成供Ubuntu平台下安装的 debian 包。 electron-installer-debian是一个用于创建 Debian Linux&#xff08;.deb&#xff09;安装包的开发工…...

7.24 SpringBoot项目实战【审核评论】

文章目录 前言一、编写控制器二、编写服务层三、Postman测试前言 我们在 上文 7.23 已经实现了 评论 功能,本文我们继续SpringBoot项目实战 审核评论 功能。逻辑如下: 一是判断管理员权限,关于角色权限校验 在 7.5 和 7.6 分别基于 拦截器Interceptor 和 切面AOP 都实现过…...

Java实现动态加载的逻辑

日常工作中我们经常遇到这样的场景&#xff0c;某某些逻辑特别不稳定&#xff0c;随时根据线上实际情况做调整&#xff0c;比如商品里的评分逻辑&#xff0c;比如规则引擎里的规则。 常见的可选方案有: JDK自带的ScriptEngine 使用groovy&#xff0c;如GroovyClassLoader、Gro…...

数据库的设计规范

文章目录 第一范式&#xff08;1NF&#xff09;&#xff1a;列不可再分 第二范式 &#xff08;2NF&#xff09;&#xff1a;所有非主键字段&#xff0c;都必须 完全依赖主键&#xff0c;不能部分依赖 第三范式&#xff08;3NF&#xff09;&#xff1a;所有非主键字段不能依赖于…...

正则表达式从放弃到入门(2):grep命令详解

正则表达式从放弃到入门&#xff08;2&#xff09;&#xff1a;grep命令详解 总结 本博文转载自 这是一篇”正则表达式”扫盲贴&#xff0c;如果你还不理解什么是正则表达式&#xff0c;看这篇文章就对了。 如果你是一个新手&#xff0c;请从头阅读这篇文章&#xff0c;如果你…...

用Java写一个王者荣耀游戏

目录 sxt包 Background Bullet Champion ChampionDaji GameFrame GameObject Minion MinionBlue MinionRed Turret TurretBlue TurretRed beast包 Bear Beast Bird BlueBuff RedBuff Wolf Xiyi 打开Eclipse创建图片中的几个包 sxt包 Background package sxt;…...

基于SSM的新闻网站浏览管理实现与设计

基于ssm的新闻网站浏览管理实现与设计 摘要&#xff1a;在大数据时代下&#xff0c;科技与技术日渐发达的时代&#xff0c;人们不再局限于只获取自己身边的信息&#xff0c;而是对全球信息获取量也日渐提高&#xff0c;网络正是打开这新世纪大门的钥匙。在传统方式下&#xff…...

【蓝桥杯软件赛 零基础备赛20周】第6周——栈

文章目录 1. 基本数据结构概述1.1 数据结构和算法的关系1.2 线性数据结构概述1.3 二叉树简介 2. 栈2.1 手写栈2.2 CSTL栈2.3 Java 栈2.4 Python栈 3 习题 1. 基本数据结构概述 很多计算机教材提到&#xff1a;程序 数据结构 算法。 “以数据结构为弓&#xff0c;以算法为箭”…...

CWE/SANS TOP 25 2022

我整理了CWE/SANS TOP25 2022年的这25类缺陷&#xff0c;分类适合的开发语言&#xff0c;其实主要是C/C语言的缺陷相对于Java、PHP、Python、C#等更高级的语言的不同&#xff0c;所以分为适合C/C语言和其它语言。但是大家不要纠结&#xff0c;例如SQL难道C/C语言程序没有吗&…...

Qt 天气预报项目

参考引用 QT开发专题-天气预报 1. JSON 数据格式 1.1 什么是 JSON JSON (JavaScript Object Notation)&#xff0c;中文名 JS 对象表示法&#xff0c;因为它和 JS 中对象的写法很类似 通常说的 JSON&#xff0c;其实就是 JSON 字符串&#xff0c;本质上是一种特殊格式的字符串…...

新知识-Tuple元组的使用

文章目录 前言一、tuple元组是什么&#xff1f;二、解决方法总结 前言 这次碰到一个需求&#xff0c;大致需要把表A中的字段1和字段2作为共同的表去查表B&#xff0c;并且一次性需要查多条&#xff0c;一开始是想的是根据字段1和字段2去查然后循环多次&#xff0c;但是这样反复…...

“此应用专为旧版android打造,因此可能无法运行”,问题解决方案

当用户在Android P系统上打开某些应用程序时&#xff0c;可能会弹出一个对话框&#xff0c;提示内容为&#xff1a;“此应用专为旧版Android打造&#xff0c;可能无法正常运行。请尝试检查更新或与开发者联系”。 随着Android平台的发展&#xff0c;每个新版本通常都会引入新的…...

【Leetcode题单】(01 数组篇)刷题关键点总结03【数组的改变、移动】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结03【数组的改变、移动】&#xff08;3题&#xff09; 数组的改变、移动453. 最小操作次数使数组元素相等 Medium665. 非递减数列 Medium283. 移动零 Easy 大家好&#xff0c;这里是新开的LeetCode刷题系列&…...

Lag-Llama:基于 LlaMa 的单变量时序预测基础模型

文章构建了一个通用单变量概率时间预测模型 Lag-Llama&#xff0c;在来自Monash Time Series库中的大量时序数据上进行了训练&#xff0c;并表现出良好的零样本预测能力。在介绍Lag-Llama之前&#xff0c;这里简单说明什么是概率时间预测模型。概率预测问题是指基于历史窗口内的…...

vue3 :deep() 深度选择器不生效

vue3 :deep() 深度选择器不生效 问题出在根节点上&#xff0c;如果没有这个根节点&#xff0c;那么:deep()不起作用&#xff0c;我把根节点加上&#xff0c;:deep()样式就生效了。在组件外加个 就生效了 参考&#xff1a; 添加链接描述...

从零构建属于自己的GPT系列1:数据预处理(文本数据预处理、文本数据tokenizer、逐行代码解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;文本数据预处理 从零构建属于自己的GPT系列2&#xff1a;语…...

c++中函数的引用

函数中的引用 引用可以作为函数的形参 不能返回局部变量的引用 #include<iostream> #include<stdlib.h> using namespace std; //形参是引用 void swap(int *x, int *y)//*x *y表示对x y取地址 { int tmp *x; *x *y; *y tmp; } void test01() { …...

IDA常用操作、快捷键总结以及使用技巧

先贴一张官方的图&#xff0c;然后我再总结一下&#xff0c;用的频率比较高的会做一些简单标注 快捷键 F系列【主要是调试状态的处理】 F2 添加/删除断点F4 运行到光标所在位置F5 反汇编F7 单步步入F8 单步跳过F9 持续运行直到输入/断点/结束 shift系列【主要是调出对应的页…...

Kibana使用指南

使用介绍主要特点应用场景数据可视化还有哪些类型安装步骤安装配置参数Elasticsearch配置参数注意事项 使用介绍 Kibana是一个开源的分析与可视化平台&#xff0c;设计出来用于和Elasticsearch一起使用的。可以用Kibana搜索、查看、交互存放在Elasticsearch索引里的数据&#…...

wvp如果确认音频udp端口开放成功

用到工具 在服务器上开启端口监听 选中udp server&#xff0c;点击创建按钮 设置服务器监听端口 在客户端连接服务器端口 选中udp客户端&#xff0c;点击创建 输入服务器地址 远程端口和本地端口&#xff0c;本地端口只要没被占用都可以使用 &#xff0c;点击确认 发送数据 …...

C#文件夹基本操作(判断文件夹是否存在、创建文件夹、移动文件夹、删除文件夹以及遍历文件夹中的文件)

目录 一、判断文件夹是否存在 1.Directory类的Exists()方法 2. DirectoryInfo类的Exists属性 二、创建文件夹 1. Directory类的CreateDirectory()方法 2.DirectoryInfo类的Create()方法 三、移动文件夹 1. Directory类的Move()方法 2.DirectoryInfo类的MoveT…...

python 交互模式和命令行模式的问题

python 模式的冲突 unexpected character after line continuation character 理论上 ide里&#xff0c;输入 python 文件路径\文件.py 就可以执行 但是有时候却报错 unexpected character after line continuation character 出现上述错误的原因是没有退出解释器&#x…...

计算机网络——数据链路层

目录 一、数据链路层的基本概念 &#xff08;一&#xff09;数据链路层的概念 &#xff08;二&#xff09;帧 &#xff08;三&#xff09;数据链路层分为哪两个部分 &#xff08;1&#xff09;LLC&#xff08;逻辑控制访问&#xff09; &#xff08;2&#xff09;MAC&…...

【限时免费】20天拿下华为OD笔试之【哈希集合】2023B-明明的随机数【欧弟算法】全网注释最详细分类最全的华为OD真题题解

文章目录 题目描述与示例题目描述输入描述输出描述&#xff1a;示例 1输入输出说明 解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述与示例 题目描述 明明生成了N 个 1 至 500 之间的随机整数。请你删去其中重复的数字&#xff0c;即…...

播放器开发(五):视频帧处理并用SDL渲染播放

目录 学习课题&#xff1a;逐步构建开发播放器【QT5 FFmpeg6 SDL2】 步骤 VideoOutPut模块 1、初始化【分配缓存、读取信息】 2、开始线程工作【从队列读帧->缩放->发送渲染信号到窗口】 VideoWidget自定义Widget类 1、定义内部变量 2、如果使用SDL&#xff0c;需要进…...

Spring MVC数据绑定的几种方法(一)

这篇文章包含spring mvc的默认数据类型绑定和简单数据类型绑定。内容来自实验。 准备&#xff1a; &#xff08;1&#xff09;在IDEA环境中从archetye创建webapp类型的maven项目exp6。 &#xff08;2&#xff09;在src\main目录下创建并标注java源代码文件夹和resources资源文…...

CSP-坐标变换(其二)

问题描述 对于平面直角坐标系上的坐标 (x,y)&#xff0c;小 P 定义了如下两种操作&#xff1a; 拉伸 k 倍&#xff1a;横坐标 x 变为 kx&#xff0c;纵坐标 y 变为 ky&#xff1b; 旋转 θ&#xff1a;将坐标 (x,y) 绕坐标原点 (0,0) 逆时针旋转 θ 弧度&#xff08;0≤θ<…...