MySQL面试题-锁相关
目录
1.MySQL 锁的类型有哪些呢?
2.如何使用全局锁
3.如果要全库只读,为什么不使用set global readonly=true的方式?
4.表级锁和行级锁有什么区别?
5.行级锁的使用有什么注意事项?
6.InnoDB 有哪几类行锁?
7.什么是共享锁和排他锁
8.意向锁有什么作用?
9.当前读和快照读有什么区别?
10.自增锁有了解吗?
11.如何处理死锁问题?
1.MySQL 锁的类型有哪些呢?
MySQL 中常见的锁类型可以分为全局锁、表级锁和行锁。下面分别介绍它们:
-
全局锁(Global Lock):锁定整个 MySQL 实例,用于执行全局操作时,比如备份整个数据库。全局锁会阻塞所有对数据库的操作,因此在使用全局锁时需要慎重考虑。
-
表级锁(Table-level Lock):锁定整张表,适用于只有少量访问,或者需要锁定整张表时。表级锁分为读锁(共享锁)和写锁(排他锁)。
-
共享锁(Shared Lock):允许多个事务同时读取同一张表,但是不能进行写操作。如果一个事务持有共享锁,其他事务也可以持有共享锁。共享锁之间不会互相阻塞。
-
排他锁(Exclusive Lock):只允许一个事务进行写操作,其他事务不能进行读取或写入操作。如果一个事务持有排他锁,其他事务无法获得共享锁或排他锁。排他锁会阻塞其他事务的读写操作,因此需要慎重使用。
-
-
行级锁(Row-level Lock):锁定表中的某一行,用于控制对表中某一行的并发访问。行级锁是在存储引擎层实现的,不同的存储引擎对行级锁的实现可能略有不同。行级锁分为共享锁和排他锁。
-
共享锁(Shared Lock):允许多个事务同时读取同一行,但是不能进行写操作。如果一个事务持有共享锁,其他事务也可以持有共享锁。共享锁之间不会互相阻塞。
-
排他锁(Exclusive Lock):只允许一个事务进行写操作,其他事务不能进行读取或写入操作。如果一个事务持有排他锁,其他事务无法获得共享锁或排他锁。排他锁会阻塞其他事务的读写操作,因此需要慎重使用。
-
2.如何使用全局锁
全局锁(Global Lock)是 MySQL 中一种最为粗暴的锁,可以锁定整个 MySQL 实例,用于执行全局操作时,比如备份整个数据库。全局锁会阻塞所有对数据库的操作,因此在使用全局锁时需要慎重考虑。
全局锁可以通过执行以下语句来获得:
FLUSH TABLES WITH READ LOCK;
执行该语句后,MySQL 将会阻塞所有对表的读写操作,直到当前连接释放锁为止。注意,FLUSH TABLES WITH READ LOCK 只能获得共享锁(读锁),不支持排他锁(写锁)。
3.如果要全库只读,为什么不使用set global readonly=true的方式?
1.在有些系统中,readonly的值会被用来做其他逻辑,比如判断主备库。所以修改global变量的方式影响太大。
2.在异常处理机制上有差异。如果执行FTWRL命令之后由于客户端发生异常断开,那么MySQL会自动释放这个全局锁,整个库回到可以正常更新的状态。而将整个库设置为readonly之后,如果客户端发生异常,则数据库就会一直保持readonly状态,这样会导致整个库长时间处于不可写状态,风险较高。
4.表级锁和行级锁有什么区别?
表级锁和行级锁是 MySQL 中最常用的两种锁类型,它们的区别在于锁定的粒度不同,可以根据具体情况选择使用不同的锁类型。
1.表级锁
表级锁是锁定整张表,通常在执行大量写操作时使用。表级锁可以分为读锁(共享锁)和写锁(排他锁)。
读锁(共享锁):多个事务可以同时对同一张表进行读取操作,但是不能进行写入操作。在读取操作期间,其他事务也可以获取读锁,但是不能获取写锁。
写锁(排他锁):只允许一个事务进行写入操作,其他事务不能进行读取或写入操作。在写入操作期间,其他事务不能获取读锁或写锁,直到当前事务释放写锁为止。
表级锁的优点是锁定粒度大,锁的管理和维护成本低,容易控制。但是,锁定整张表会导致其他事务等待锁的时间变长,降低并发性能。因此,在执行大量写操作时使用表级锁要慎重,需要考虑锁的粒度和并发性能的平衡。
2.行级锁
行级锁是锁定表中的某一行,通常在执行大量读操作时使用。行级锁可以分为共享锁和排他锁,具体实现依赖于存储引擎的实现。
共享锁:多个事务可以同时读取同一行数据,但是不能进行写操作。在读取操作期间,其他事务也可以获取共享锁,但是不能获取排他锁。
排他锁:只允许一个事务进行写入操作,其他事务不能进行读取或写入操作。在写入操作期间,其他事务不能获取共享锁或排他锁,直到当前事务释放排他锁为止。
相对于表级锁,行级锁的优点是锁定粒度更细,可以减少锁冲突的概率,提高并发性能。但是,行级锁会带来额外的开销,包括锁的管理和维护成本,因此需要权衡锁定粒度和性能开销,选择适合的锁类型。
需要注意的是,MySQL 在不同的存储引擎上实现锁的方式不同,比如 MyISAM 存储引擎使用表级锁,InnoDB 存储引擎使用行级锁和表级锁的组合,因此在使用锁时需要注意存储引擎的不同实现。
5.行级锁的使用有什么注意事项?
1.避免锁定过多行
行级锁的锁定粒度比表级锁要细,锁的管理和维护成本也更高,如果锁定了过多的行,可能会导致锁冲突和性能问题。因此,在使用行级锁时应该尽量减少锁定的行数,只锁定必要的行,避免锁的数量和时间过长。
2.尽量使用索引
行级锁在锁定某一行时,会对该行所在的索引加锁。如果没有使用索引,MySQL 将会对整张表进行扫描,导致锁定粒度变大,降低并发性能。因此,在使用行级锁时,应该尽量使用索引,提高锁定粒度,减少锁的数量和时间。
3.优化事务的大小
事务的大小会直接影响锁定的行数和时间,如果事务过大,将会导致锁定的行数过多,增加锁冲突和性能问题的概率。因此,在使用行级锁时,应该尽量优化事务的大小,尽可能减小事务的范围和时间,提高并发性能。
例如,有一个商品表 products,需要批量更新价格,如果事务过大,将会导致锁定的行数过多,性能较差,可以将大事务分为多个小事务,例如:
-- 批量更新前半部分商品价格
BEGIN;
UPDATE products SET price = price * 0.9 WHERE id BETWEEN 1 AND 500;
COMMIT;-- 批量更新后半部分商品价格
BEGIN;
UPDATE products SET price = price * 0.9 WHERE id BETWEEN 501 AND 1000;
COMMIT;
4.使用锁的超时机制
MySQL 支持锁的超时机制,当锁定时间超过指定的时间时,将自动释放锁,避免锁冲突和死锁问题。在使用行级锁时,应该合理设置锁的超时时间,避免长时间等待锁导致性能问题。
例如,有一个账户表 account,需要转账操作,如果锁定的时间过长,将会影响并发性能,可以使用锁的超时机制来避免锁定时间过长,例如:
BEGIN;
SELECT * FROM account WHERE id = 1 FOR UPDATE NOWAIT;
-- 更新账户表中 id=1 的记录
COMMIT;
这里使用 NOWAIT 关键字来设置锁的超时机制,如果获取不到锁,将立即返回错误,避免了锁定时间过长。
需要注意的是,使用锁的超时机制时,应该避免死锁的情况,如果出现死锁,超时机制可能会误判导致数据不一致。
6.InnoDB 有哪几类行锁?
实际上,InnoDB 行锁定不仅仅是对索引数据页上的记录加锁,而是对整个索引记录(包括数据页和索引页)进行加锁。当使用 InnoDB 表时,MySQL 提供了三种行级锁定方式,分别是:
-
记录锁(Record Lock):也称行锁,只锁定某个索引上的一行记录,即对某个记录加锁。
-
间隙锁(Gap Lock):锁定索引记录之间的间隙,但不包括记录本身,锁定某个范围之前的间隙或之后的间隙,但不包括指定范围的记录本身。例如,使用
WHERE子句查询某个范围内的记录时,如果使用间隙锁定,将锁定范围之前或之后的间隙,避免其他事务插入相同范围的记录。 -
Next-Key 锁(Next-Key Lock):锁定索引记录和索引记录之间的间隙,包括索引记录本身和之前的间隙,但不包括之后的间隙。Next-Key 锁包含了 Record Lock 和 Gap Lock,确保了同时避免幻读和更新丢失。
InnoDB 默认的隔离级别是 REPEATABLE-READ,行锁默认使用的是 Next-Key Lock。在 REPEATABLE-READ 隔离级别下,MySQL 会在读取数据时锁定所有读取到的数据行(记录锁),同时锁定所有查询范围之前的间隙(Gap Lock)。此外,MySQL 还会对每个查询的结果集中的第一个记录之前的间隙加上 Next-Key Lock,确保其他事务不会插入相同查询范围内的记录。这样可以避免幻读的问题。
需要注意的是,InnoDB 行级锁定是基于索引实现的,如果没有使用索引,MySQL 会自动添加一个隐藏的索引,然后再对该索引上的记录进行锁定。同时,InnoDB 行锁定是基于事务的,只有在事务隔离级别为可重复读或串行化时才会生效。
7.什么是共享锁和排他锁
共享锁和排他锁是数据库中常用的两种锁定方式,用于控制对共享资源的访问和修改,保证数据的一致性和完整性。
共享锁允许多个事务同时读取同一份数据,但是只有一个事务可以对数据进行修改。在获取共享锁之后,其他事务可以继续获取共享锁,但是不能获取排他锁。共享锁通常用于读取数据时使用,可以防止并发修改数据时出现不一致的情况。
排他锁只允许一个事务对数据进行修改,其他事务需要等待该事务释放锁后才能进行修改。在获取排他锁之后,其他事务不能获取共享锁和排他锁。排他锁通常用于修改数据时使用,可以避免并发修改数据时出现竞争的情况。

举个例子来说,假设有一个银行账户表,多个用户需要对该表进行读取和修改。在读取账户余额时,可以使用共享锁,多个用户可以同时读取账户余额;在修改账户余额时,需要使用排他锁,只有一个用户可以对账户余额进行修改。如果多个用户同时修改账户余额,就可能会导致数据不一致或数据丢失的问题,因此需要使用排他锁保证数据的完整性。
8.意向锁有什么作用?
在多用户环境下,事务之间可能会相互冲突,需要对访问的数据行进行加锁以防止冲突。但是在一个事务中,如果需要对多个数据行进行加锁,那么需要先获取这些数据行所在的数据页上的锁,然后再获取对应的行锁,这样就会产生很多额外的开销,影响系统性能。
为了减少这种开销,InnoDB使用意向锁来帮助事务减少对锁的获取次数。意向锁并不实际限制数据行的访问,而是用来指示一个事务即将获取的锁的类型(共享锁或排他锁)。当事务请求获取一个数据行上的行级别锁时,InnoDB会首先获取该数据页的意向锁,以确保该数据页上不会出现与该事务请求相冲突的其他锁。
在 InnoDB 存储引擎中,意向锁分为意向共享锁(Intention Shared Lock)和意向排他锁(Intention Exclusive Lock)两种。意向共享锁表示事务需要在一个数据页上获取多个行共享锁,而意向排他锁表示事务需要在一个数据页上获取行排他锁。
意向锁是表级锁,共有两种:
- 意向共享锁(Intention Shared Lock,IS 锁):事务有意向对表中的某些记录加共享锁(S 锁),加共享锁前必须先取得该表的 IS 锁。
- 意向排他锁(Intention Exclusive Lock,IX 锁):事务有意向对表中的某些记录加排他锁(X 锁),加排他锁之前必须先取得该表的 IX 锁。
意向锁并不是一个实际存在的锁,它只是对一个事务请求所需的行级别锁的指示。意向锁是由数据库自己维护的,用户无法手动操作意向锁。它的作用是帮助数据库减少锁竞争,提高并发性能。
当一个事务需要对一个数据行加锁时,InnoDB 引擎会先获取该数据行所在的数据页上的意向锁,然后再获取对应的行级别锁。这样可以确保该数据页上不会出现与该事务请求相冲突的其他锁。
意向锁之间是互相兼容的。

意向锁和共享锁和排它锁互斥(这里指的是表级别的共享锁和排他锁,意向锁不会与行级的共享锁和排他锁互斥)。

9.当前读和快照读有什么区别?
当前读和快照读的区别主要在于读取的数据版本不同,以及读取的方式和时间不同。
1.数据版本不同
- 当前读:读取的是最新的数据版本。
- 快照读:读取的是事务开始时的数据版本,也称为一致性读。
2.取方式和时间不同
- 当前读:需要加锁,保证读取的数据是最新的,适用于修改、删除等操作,会阻塞其他事务的写操作,但不会阻塞读操作。
- 快照读:不需要加锁,可以并发读取数据,适用于查询操作。快照读的时间点是事务开始时,只能读取到该时间点之前的数据版本。
只有在事务隔离级别 RC(读取已提交) 和 RR(可重读)下,InnoDB 才会使用一致性非锁定读:
- 在 RC 级别下,对于快照数据,一致性非锁定读总是读取被锁定行的最新一份快照数据。
- 在 RR 级别下,对于快照数据,一致性非锁定读总是读取本事务开始时的行数据版本。
10.自增锁有了解吗?
自增锁是 InnoDB 存储引擎中的一种特殊的行级锁,主要用于保证自增列的唯一性。在 InnoDB 存储引擎中,自增列一般通过给自增列加一个独占锁来保证唯一性。这个独占锁就是自增锁。
当一个事务往一张表中插入一行数据时,如果这行数据的自增列值需要通过获取自增锁来实现自增,那么该事务会在该自增锁上加一个排他锁,然后获取自增值并插入到新的行中,最后释放锁。其他事务在获取自增值时会阻塞,直到持有自增锁的事务释放锁。
自增锁的作用是保证自增列的唯一性,避免出现重复的自增值。它的加锁范围是自增索引上的锁,锁定自增值的同时,也会锁定自增值的上一个值,避免其他事务在插入数据时重复使用自增值。
需要注意的是,由于自增锁的使用会造成事务的阻塞,因此在高并发的场景下,如果频繁地往表中插入数据,就可能会出现自增锁成为瓶颈的情况。在这种情况下,可以考虑使用非自增列,或者使用更高效的自增列实现方式,例如使用主键生成器来生成唯一的主键值。
11.如何处理死锁问题?
在数据库中,锁是为了保证数据的一致性和完整性而引入的机制。但是,当多个事务同时获取锁并且互相等待对方释放锁的时候,就会发生死锁问题。这时候,事务将无法继续执行下去,也无法回滚或提交,只能被强制终止。
解决策略:
等待:直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout来设置。
死锁检测:发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数innodb_deadlock_detect设置为on,表示开启这个逻辑。
死锁检测缺点:每个新来的被堵住的线程,都要判断会不会由于自己的加入导致了死锁,这是一个时间复杂度是O(n)的操作。要耗费大量的CPU资源
相关文章:
MySQL面试题-锁相关
目录 1.MySQL 锁的类型有哪些呢? 2.如何使用全局锁 3.如果要全库只读,为什么不使用set global readonlytrue的方式? 4.表级锁和行级锁有什么区别? 5.行级锁的使用有什么注意事项? 6.InnoDB 有哪几类行锁ÿ…...
Windows 终端编译 C代码
E:\My_SoftWare\Window gcc\windowbianji\mingw64\bin 此电脑--》属性--》系统--》高级系统设置--》环境变量--》Path--》新建--》粘贴路径 E:\My_SoftWare\Window gcc\windowbianji\mingw64\bin 打开命令终端 E: 回车 dir 显示所有文件 cd E:\My_SoftWare\Window gcc\C_co…...
SpringCloud:Feign的使用及配置
目录 Feign的使用及配置 1、Feign替代RestTemplate 2、使用Fegin步骤 3、自定义配置 4、Feign使用优化 5、Feign的最佳实践方式 Feign的使用及配置 1、Feign替代RestTemplate RestTemplate方式远程调用的问题 问题: 1、代码可读性差,编程体验不同…...
Parquet学习与使用之BloomFilter的应用
写在前面 最近在自己做自定义的OLAP系统,文件格式上用的是Parquet,但是发现Parquet各个API的示例代码很少。所以就打算把这个系列的文章写一下。 1. Parquet的Filter Parquet的过滤支持两大类,一类是基于Footer中的元数据进行RowGroup级别…...
95%置信区间计算-理解
机器学习中做多次试验后,需要计算指标的95%置信区间。 假设做了10次试验,计算得出的某指标分别为{x1,…,x10} 其均值为μ(x1...x10)/10\mu(x1 ... x10)/10μ(x1...x10)/10 方差σ∑(xi−μ)2/10\sigma\sum(x_i -\mu)^2/10σ∑(xi−μ)2/10 95%置信…...
深度学习pytorch实战三:VGG16图像分类篇自建数据集图像分类三类
1.自建数据集与划分训练集与测试集 2.模型相关知识 3.model.py——定义AlexNet网络模型 4.train.py——加载数据集并训练,训练集计算损失值loss,测试集计算accuracy,保存训练好的网络参数 5.predict.py——利用训练好的网络参数后,…...
2023年3月软考高项(信息系统项目管理师)报名走起!!!
信息系统项目管理师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资…...
模电学习11 运算放大器学习入门
一、基本概念 运算放大器简称运放,是一种模拟电路实现的集成电路,可以对信号进行很高倍数的放大。一般有正相输入端、反相输入端、输出端口、正电源、负电源等接口。 运放可工作在饱和区、放大区,其中放大区极其陡峭,因为运放的放…...
spring学习3.5
Bean是什么 Spring里面的Bean就类似是定义的一个组件,而这个组件的作用就是实现某个功能的,这里所定义的Bean就相当于给了你一个更为简便的方法来调用这个组件去实现你要完成的功能。 IoC是什么 谁控制谁,控制什么? 传统Java SE程…...
名创优品:国内“触礁”,海外“提速”
在互联网经济十分发达、实体经济不太景气的时代背景下,自有品牌零售商代表名创优品却逆势而上,开始向着全球品牌类生活用品零售市场发起冲击,并凭借着“极致性价比大规模跑量”的独特优势在该领域取得了十分可观的成绩。 随着“Z时代”人群逐…...
Java学习笔记 --- Tomcat
一、JavaWeb 的概念 JavaWeb 是指,所有通过 Java 语言编写可以通过浏览器访问的程序的总称,叫 JavaWeb。 JavaWeb是基于请求和响应来开发的。请求是指客户端给服务器发送数据,叫请求 Request。 响应是指服务器给客户端回传数据,叫…...
面向对象设计模式:行为型模式之状态模式
文章目录一、引入二、状态模式2.1 Intent 意图2.2 Applicability 适用性2.3 类图2.4 Collaborations 合作2.5 Implementation 实现2.5 状态模式与策略模式的对比2.5 状态模式实例:糖果机2.6 状态模式实例:自行车升降档一、引入 State Diagram 状态图&am…...
【Python入门第二十五天】Python 作用域
变量仅在创建区域内可用。这称为作用域。 局部作用域 在函数内部创建的变量属于该函数的局部作用域,并且只能在该函数内部使用。 实例 在函数内部创建的变量在该函数内部可用: def myfunc():x 100print(x)myfunc()运行实例 100函数内部的函数 如…...
运行时数据区及程序计数器
运行时数据区 概述 运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时…...
手写操作系统+文件系统开源啦
哈喽,我是子牙,一个很卷的硬核男人。喜欢研究底层,聚焦做那些大家想学没地方学的课程:手写操作系统、手写虚拟机、手写模拟器、手写编程语言… 今年是我创业的第二年,已经做了两个课程:手写JVM、手写操作系…...
小众但意外觉得蛮好用的剪辑软件!纯良心分享
爱剪辑 有开屏广告,一共3个界面:首页、剪同款、我的。 剪辑、配乐、字幕、滤镜、加速、贴纸、配音等主流功能都有。 特色功能有剪裁视频、倒放视频、视频旋转、视频转换GIF、转场、提取音频、画中画等。 还可以拼接视频,不过不支持FLV等小众文…...
一文带你入门angular(下)
一、angular get数据请求 angular5.x之后get,post和服务器交互使用的是HttpClientModule模块。 1.首先要在app.module.ts中引入HttpClientModule并注入 import {HttpClientModule} from "angular/common/http" 注入: import:[ …...
2023-3-6刷题情况
分巧克力 题目描述 儿童节那天有 KKK 位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。 小明一共有 NNN 块巧克力,其中第 iii 块是 HiWiH_i \times W_iHiWi 的方格组成的长方形。 为了公平起见,小明需要从这 NNN 块巧克力中切出 KKK…...
一篇教你解决如何在不加锁的情况下解决多线程问题!
怎样在不加锁的情况下解决线程安全问题,你需要了解lock free和wait free这两个概念,在此之前我们先从最简单的有锁编程开始。 我们知道,多线程同时修改共享变量时会出现数据不一致的问题,比如多个线程同时对一个变量加1ÿ…...
OPT(奥普特)一键测量传感器SmartFlash高精度的四重保证
OPT(奥普特)一键测量传感器SmartFlash集成了机器视觉的边缘提取、自动匹配、自动对焦、自动学习及图像合成等人工智能技术,采用双远心光路及多角度照明系统设计,搭载高精度运动平台,并通过亚像素边缘提取算法处理图像&…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
密码学基础——SM4算法
博客主页:christine-rr-CSDN博客 专栏主页:密码学 📌 【今日更新】📌 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 编辑…...
