MySQL 事务原理
文章目录
- 1、事务
- 1.1、ACID 特性
- 1.1.1、原子性
- undo log
- 1.1.2、一致性
- 1.1.3、* 隔离性
- 1.1.4、持久性
- redo log
- 1.2、事务控制语句
- 2、隔离级别
- 2.1、隔离级别的分类
- 2.1.1、读未提交 RU
- 2.1.2、读已提交 RC
- 2.1.3、可重复读 RR
- 2.1.4、串行化 SC
- 2.2、并发事务读异常
- 2.2.1、* 脏读
- 2.2.2、* 不可重复读
- 2.2.3、* 幻读
- 2.2.4、测试代码
- 3、MVCC
- 3.1、当前读 & 快照读
- 3.2、Read View
- 3.2.1、read view 生成
- 3.2.2、read view 属性
- 3.3、聚集索引隐藏列
- 3.4、undo log
- 3.4、事务的可见性
1、事务
事务 (transaction)
:并发的场景下,用户定义的操作序列,这些操作要么都做,要么都不做,不可分割。
目的:将数据库从一种一致性状态转换为另一种一致性状态,保证系统始终处于一个完整且正确的状态。
1.1、ACID 特性
- 原子性
(Atomicity)
- 一致性
(Consistency)
- 隔离性
(Isolation)
- 持久性
(Durability)
1.1.1、原子性
一个事务中的操作,要么都做,要么都不做,不存在中间状态,是一个不可分割的工作单位。若事务执行过程发生错误,回滚到事务初始状态。
实现机制: undo log
。
undo log
undo log
回滚日志,存放在共享表空间内,用于存储旧版本的数据。
undo log
是逻辑日志,回滚时将数据库逻辑地恢复到原来的样子,也就是说,根据 undo log
记录的事务 DML 操作,做之前的相反操作,实现回滚操作,保证了事务的原子性和一致性。
此外,undo log
也可以用来实现 MVCC。用户读取记录时,若该记录被其他事务占用,当前事务可以通过 undo log
读取之前事务 DML 操作提交后的行版本信息,以此实现非锁定读。
总结 undo log
的作用
- 事务回滚:记录事务 DML 操作步骤,通过逆运算(逻辑取反)实现事务回滚。
- MVCC:记录事务 DML 操作提交后产生的行版本信息。
1.1.2、一致性
事务的前后,数据满足完整性约束,数据库保持一致性状态。
一致性指的是事务将数据库从一种一致性状态转变为下一种一致性的状态,在事务执行前后,数据库完整性约束没有被破坏。一个事务需要提交后才会被其他事务可见。
一致性的种类
- 数据一致性(完整性约束),必须遵守
- 预期一致性(逻辑一致性),适当破坏。例:查询是否存在,不存在写入,可能出现数据查询不存在,插入时却存在,报错。
实现机制:原子性 + 隔离性 + 一致性实现。
1.1.3、* 隔离性
并发事务间相互隔离,互不影响,避免多个事务并发异步执行进而导致数据的不一致。
实现机制:为了提升性能,设定不同程度的隔离级别,适度破坏逻辑一致性。
- 锁:用来并发处理 DML 操作。数据库中提供粒度锁的策略,针对表(聚集索引 B+ 树)、页(聚集索引 B+ 树叶子节点)、行(叶子节点中某一段行记录)三种粒度加锁
- MVCC :多版本并发控制。主要解决一致性非锁读,通过记录和获取行版本,而不是使用锁来限制读操作,从而实现高效并发读性能。
1.1.4、持久性
事务一旦提交,其结果就是永久性的,即使系统故障也不丢失。
实现机制: redo log
。
redo log
redo log
重做日志,用于实现事务的持久性。
事务提交后,事务 DML 操作持久化,记录事务 DML 操作对应物理页修改的内容,写入 redo log 磁盘文件。发生宕机等故障时,恢复数据库数据。
redo log
属于 WAL (Write Ahead Log)
预写日志,用于数据恢复,顺序写磁盘,再通过其他线程异步刷到 B+ 树。与 redis 的aof
类似。
1.2、事务控制语句
innoDB 中一条 sql 语句是一个事务。若想多条语句构成事务,采用事务控制语句。
-- 显示开启事务
START | BEGIN TRANSACTION
-- 提交事务,并使得已对数据库做的所有修改持久化
COMMIT
-- 回滚事务,结束用户的事务,并撤销正在进行的所有未提交的修改
ROLLBACK
-- 创建一个保存点,一个事务可以有多个保存点
SAVEPOINT identifier
-- 删除一个保存点
RELEASE SAVEPOINT identifier
-- 事务回滚到保存点
ROLLBACK TO [SAVEPOINT] identifier
2、隔离级别
ISO 和 ANIS SQL 标准制定了四种事务隔离级别,目的在于提升数据库并发性能。
不同隔离级别的区别在于读操作的加锁,写操作均加排他锁。隔离级别的高低,与事务请求锁的数量和保持锁时间的长短相关。级别越高,性能越低;级别越低,逻辑一致性受到的影响越大。
2.1、隔离级别的分类
- 读未提交:事务还未提交,其变更就能被其他事务看到
- 读已提交:事务提交后,其变更才能被其他事务看到
- 可重复读:事务执行过程中看到的数据,一直跟与该事务启动时看到的数据是一致的
- 串行化:对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;
2.1.1、读未提交 RU
读未提交,READ UNCOMMITTED
。事务还未提交,其修改就能被其他事务看到。
- 读:不做处理
- 写:自动加 X 锁
逻辑错误:脏读。
2.1.2、读已提交 RC
读已提交,READ COMMITTED
。事务提交后,其他事务才能看到修改。大部分数据库采用的隔离级别,如 oracle, SQL Server 等。
- 读:MVCC,读取最新版本的行数据
- 写:自动加 X 锁
MVCC 在事务期间每次读取数据时,生成新的 read view,这也意味着同一事务多次读取同一条数据可能出现数据不一致(不可重复读)。因为在多次读取数据期间可能有其他事务修改并提交了该条记录。
逻辑错误:不可重复读。
2.1.3、可重复读 RR
可重复读 (RR) ,REPEATABLE READ
,事务执行过程中看到的数据,一直跟与该事务启动时看到的数据是一致的。MySQL InnoDB 引擎的默认隔离级别。
- 读:MVCC,读取事务开始前版本的行数据
- 写:自动加 X 锁
MVCC 在事务启动时,生成新的 read view
,整个事务期间读取数据使用这个 read view
,这样保证了在事务期间读到的数据都是事务启动前的记录。
逻辑错误:幻读。
2.1.4、串行化 SC
串行化,SERIALIZABLE
,对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
- 读:自动加 S 锁 (next-key locking)
- 写:自动加 X 锁
2.2、并发事务读异常
不同隔离级别由于逻辑一致性问题造成的并发异常。
- 脏读:读到其他事务未提交的数据。
- 不可重复读:前后读取的数据不一致。
UPDATE
- 幻读:前后读取的记录数量不一致。
INSERT DELETE
2.2.1、* 脏读
一个事务读到了另一个事务未提交的修改(读到脏数据)。
不可重复读在 RU 隔离级别存在。在读写分离的场景下,可以将 slave 节点设置为 READ UNCOMMITTED
。此时脏读不影响,在 slave 上查询并不需要特别精准的返回值。
例如:session B 读到了 session A 中事务未提交的脏数据。
seq | session A | session B |
---|---|---|
1 | SET @@tx_isolation = ‘READ UNCOMMITTED’; | SET @@tx_isolation = ‘READ UNCOMMITTED’; |
2 | BEGIN; | BEGIN; |
4 | UPDATE account_t SET money = money - 100 WHERE name = ‘A’; | |
5 | SELECT money FROM account_t WHERE name = ‘A’; | |
6 | COMMIT; | COMMIT; |
2.2.2、* 不可重复读
同一事务内两次读取同一个数据前后不一样。一个事务读到了另一个事务的提交的修改
不可重复读在 RC 隔离级别存在。一般来说,不可重复读的问题可以接受,因为读到已经提交的数据,不会带来很大的问题。
例如:session B 读到了 session A 中事务提交的修改,造成两次读取同一个数据不一样。
seq | session A | session B |
---|---|---|
1 | SET @@tx_isolation = ‘READ COMMITTED’; | SET @@tx_isolation = ‘READ COMMITTED’; |
2 | BEGIN; | BEGIN; |
4 | SELECT money FROM account_t WHERE name = ‘A’; | |
5 | UPDATE account_t SET money = money - 100 WHERE name = ‘A’; | |
6 | COMMIT ; | SELECT money FROM account_t WHERE name = ‘A’; |
7 | COMMIT; |
2.2.3、* 幻读
同一事务两次读取同一个范围内的记录得到的结果集不一样。
幻读在 RR 隔离级别存在,仅在当前读下出现。
例如:由于 session A 的事务提交了插入操作,导致 session B 两次查询范围的结果不一样。
seq | session A | session B |
---|---|---|
1 | SET @@tx_isolation = ‘REPEATABLE READ’; | SET @@tx_isolation = ‘REPEATABLE READ’; |
2 | BEGIN; | BEGIN; |
4 | SELECT * FROM account_t WHERE id >= 2; | |
5 | INSERT INTO account_t VALUES (4, ‘D’, 1000); | |
6 | COMMIT ; | |
7 | SELECT * FROM account_t WHERE id >= 2; | |
COMMIT; |
解决:通过读加锁(next-key locking)
seq | session A | session B |
---|---|---|
1 | SET @@tx_isolation = ‘REPEATABLE READ’; | SET @@tx_isolation = ‘REPEATABLE READ’; |
2 | BEGIN; | BEGIN; |
4 | SELECT * FROM account_t WHERE id >= 2 FOR UPDATE | IN SHARE MODE; | |
INSERT INTO account_t VALUES (4, ‘D’, 1000); | ||
6 | COMMIT ; | |
7 | SELECT * FROM account_t WHERE id >= 2; | |
COMMIT; |
MySQL InnoDB 引擎的默认隔离级别是可重复读,但是它可以很大程度上避免幻读现象。
- 针对快照读:通过 MVCC 方式解决了幻读。因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
- 针对当前读:是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。因为当执行 select … for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。
2.2.4、测试代码
DROP TABLE IF EXISTS `account_t`;
CREATE TABLE `account_t` (`id` INT(11) NOT NULL,`name` VARCHAR(225) DEFAULT NULL,`money` INT(11) DEFAULT 0,PRIMARY KEY(`id`),KEY `idx_name` (`name`)
) ENGINE = innoDB AUTO_INCREMENT=0 DEFAULT CHARSET = utf8;SELECT * FROM `account_t`;INSERT INTO `account_t` VALUES (1, 'A', 1000), (2, 'B', 1000), (3, 'B', 1000);ROLLBACK;-- 脏读:一个事务读取了另一个未提交事务的修改
-- 隔离级别:READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
BEGIN
-- 脏读事务1
UPDATE `account_t` SET `money` = `money` - 100 WHERE `name` = 'A';
-- 脏读事务2
SELECT `money` FROM `account_t` WHERE `name` = 'A';
COMMIT;-- 不可重复读:一个事务内两次读取同一个数据不一样
-- 隔离级别:READ COMMITTED,解决了脏读问题
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN
-- 不可重复读事务1
UPDATE `account_t` SET `money` = `money` - 100 WHERE `name` = 'A';
-- 不可重复读事务2
SELECT `money` FROM `account_t` WHERE `name` = 'A';
COMMIT;-- 幻读:一个事务内两次读取同一个范围内的记录得到的结果集不一样。
-- 隔离级别:REPEATABLE READ,解决了不可重复读
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
BEGIN
-- 幻读事务1
INSERT INTO `account_t` VALUES (4, 'D', 1000);
-- 幻读事务2
SELECT * FROM `account_t` WHERE `id` >= 2;
-- 幻读事务2:解决幻读问题
SELECT * FROM `account_t` WHERE `id` >= 2 FOR UPDATE;
COMMIT;
3、MVCC
多版本并发控制 MVCC(Multiversion Concurrency Control)
,用来实现一致性的非锁定读。非锁定读是指不需要等待访问记录 X 锁的释放。因此 MVCC 没有读写阻塞,只有写写阻塞,提高了并发性。
MVCC 只在读已提交和可重复读的隔离级别下工作,与其他隔离级别不兼容。
MVCC 通过 read view,聚集索引隐藏列,undo log 来实现,关键是解决事务的可见性问题。
3.1、当前读 & 快照读
innoDB 支持的读方式
- 当前读(锁定读):读取最新版本的记录,对读取的记录加锁(悲观锁),保证其他并发事务不能修改当前记录。
select ... lock in share mode | for update
insert, delete, update
,不管什么隔离级别,DML 操作均加锁。- undo log
- 快照读(非锁定读):读取记录的一个快照,对读取的记录不加锁。普通
SELECT
语句
MVCC 的读指的是快照读(非锁定读),因为没有事务需要对历史数据进行 DML 操作。
在读已提交和可重复读的隔离级别下,对于快照数据的定义不同
- RC 级别:读取当前事务锁定行的最新行记录。
- RR 级别:读取启动事务时的行记录版本。
3.2、Read View
read view 是事务进行快照读的时候产生的读视图,保存了当前事务开启时所有活跃事务的列表。
3.2.1、read view 生成
在读已提交和可重复读的隔离级别下,read view 的区别仅在于创建 read view 的时机不同:
- RC 级别:每次读取数据时,生成新的 read view。
- RR 级别:启动事务时,生成新的 read view,一直使用到事务提交。
3.2.2、read view 属性
m_ids
:创建 read view 时,活跃事务的事务 id 列表。活跃事务指的是已启动但是未提交的事务。min_trx_id
:创建 read view 时,活跃事务的最小事务 idmax_trx_id
:创建 read view 时,预分配给下一个未开启事务的 id,即全局事务的最大事务 id + 1creator_trx_id
:创建该 read view 的事务的事务 id
创建 read view 时,read view 属性与事务状态(已提交 - 启动未提交 - 未启动)的关系
3.3、聚集索引隐藏列
聚集索引记录的隐藏列
trx_id
:事务修改记录时,trx_id
记录生成该版本的事务 id。roll_pointer
:事务修改记录时,将旧记录写入 undo log,roll_pointer
指向旧版本记录,通过它可以找到修改前的记录。
3.4、undo log
用户读取记录时,若该记录被其他事务占用,当前事务可以通过 undo 读取之前事务 DML 操作提交后的行版本信息,以此实现非锁定读。
innoDB 通过 undo log 保存每个记录的多个版本,每个事务读到的记录版本可能是不一样的。在同一个事务中,用户只能看到该事务创建快照之前已经提交的修改和该事务本身做的修改。
3.4、事务的可见性
事务的可见性问题:当前事务访问某条记录时该记录是否可见
判断规则是:判断生成该版本的事务 id (trx_id
)与生成 read view 的当前事务 id 的关系。具体来说,生成 read view 的当前事务处于启动未提交状态,重点判断生成该版本事务的所处状态。
trx_id = creator_trx_id
:当前事务访问自己修改的记录,该版本记录对当前事务可见。trx_id < min_trx_id
:生成该版本的事务在当前事务生成 read view 前已提交,该版本记录对当前事务可见。trx_id > max_trx_id
:生成该版本的事务在当前事务生成 read view 后启动,该版本记录对当前事务不可见。min_trx <= trx_id <= max_trx_id
,判断生成该版本的事务 id 是否在启动未提交的事务 id 列表中- 存在:生成该版本记录的事务已启动但未提交,该版本记录对当前事务不可见
- 不在:生成该版本记录的事务已提交,该版本记录对当前事务可见
整理一下,方便记忆:
trx_id = creator_trx_id
,版本事务 = 当前事务trx_id < min_trx_id
:版本事务已提交,可见。trx_id > max_trx_id
: 版本事务后启动,不可见。min_trx <= trx_id <= max_trx_id
,版本事务 id 是否在启动未提交的事务 id 列表中- 存在:版本事务启动未提交,不可见
- 不在:版本事务已提交,可见
相关文章:
MySQL 事务原理
文章目录1、事务1.1、ACID 特性1.1.1、原子性undo log1.1.2、一致性1.1.3、* 隔离性1.1.4、持久性redo log1.2、事务控制语句2、隔离级别2.1、隔离级别的分类2.1.1、读未提交 RU2.1.2、读已提交 RC2.1.3、可重复读 RR2.1.4、串行化 SC2.2、并发事务读异常2.2.1、* 脏读2.2.2、*…...
软件测试面试自我介绍/项目介绍居然还有模板?我要是早点发现就好了
目录 1、自我介绍 2、项目介绍 2.1、最全电商项目介绍 2.2、电商项目介绍 2.3、在线教育项目介绍 2.4、互联网金融项目介绍 总结 1、自我介绍 以XXX简历来举例(参照下面的案例,编写你的自我介绍,框架就是:我是谁࿰…...
new RegExp的使用
1.RegExp是什么 当检索某个文本时,可以使用一种模式来描述要检索的内容。RegExp 就是这种模式 RegExp 对象用于存储检索模式。 var patt1new RegExp("e");当使用该 RegExp 对象在一个字符串中检索时,将寻找的是字符 “e” g :表…...
供应商管理软件如何选型 好用的供应商管理软件推荐
供应商管理是采购中的重要环节。对于很多企业来说,做好内部供应商管理就能在行业竞争中提升自身的效益与竞争能力,供应商已成为一种战略筹码。 但在企业进行供应商管理过程中,往往会遇到供应商信息数据收集不全、等级划分不合理、绩效评价机…...
Python3遍历文件夹提取关键字及其附近字符
要求: 1,遍历文件夹下所有的.xml文件 2,从.xml文件中提取关键字以及左右十个字符 3,输出到excel 一:遍历文件夹找到所有xml文件及其路径 for root, dirs, files in os.walk(self.inputFilePath):for file in files:…...
「1」线性代数(期末复习)
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 第一章 行列式 行列式是一个数,是一个结果三阶行列式的计算:主对角线的乘…...
C++7:STL-模拟实现vector
目录 vector的成员变量 构造函数 reserve size() capacity() push_back 一些小BUG 赋值操作符重载 析构函数 【】操作符重载 resize pop_back Insert 迭代器失效 erase 二维数组问题 总结一下 vector,翻译软件会告诉你它的意思是向量,但其…...
笑死,面试官又问我SpringBoot自动配置原理
面试官:好久没见,甚是想念。今天来聊聊SpringBoot的自动配置吧? 候选者:嗯,SpringBoot的自动配置我觉得是SpringBoot很重要的“特性”了。众所周知,SpringBoot有着“约定大于配置”的理念,这一…...
分布式缓存服务DCS-企业版性能更强,稳定性更高
背景介绍 近年来,随着各行业业务需求急速增加,数据量和并发访问量呈指数级增长,原来只能依附于关系型数据库的传统“缓存”逐渐难以支撑上层业务,开源Redis也面临着如“容量有限”、 “可靠性有限”、 “数据重复拷贝,…...
HTTP基本原理
目录URL简单定义格式HTTP和HTTPSHTTP的请求过程。请求响应响应体HTTP2.0总结URL 简单定义 通过一个链接,使我们可以找到网络上的某个资源,这个链接就是URL。 格式 URL并不是随便写的,而是有固定的格式。基本的组成格式如下。 schme://[us…...
【云原生】Kubernetes(k8s)最新版本详细保姆级安装教程
前言 Kubernetes简称k8s,是一个开源的,用于管理云平台中多个主机上的容器化的应用,k8s目标是让部署容器化的应用简单并且高效,k8s提供了应用部署,规划,更新,维护的一种机制。 本文是总结了在安…...
JVM - 类加载,连接和初始化
目录 类加载和类加载器 概述 类加载要完成的功能 加载类的方式 类加载器 类加载器的关系 类加载器说明 双亲委派模型 工作过程如下: 双亲委派模型说明: 破坏双亲委派模型: 类连接和初始化 类连接主要验证的内容 类连接中的解析…...
[carla]关于odometry坐标中的角度坐标系 以及 到地图的映射问题
1.获取车辆的Odometry原始信息 在carla中,通过订阅/carla/ego_vecle/odometry 可以查看车辆的全局位置信息,例如: > header: seq: 118872stamp: secs: 5946nsecs: 5720187frame_id: "map" child_frame_id: "ego_vehicle" pos…...
Python 正则表达式
正则表达式主要用来查找和匹配字符串的。 一、正在表达式基础 字符 描述 示例 TIY\ 示意特殊序列(也可用于转义特殊字符)如:空白字符 "\s" . 任何字符(换行符除外) "he..o" ^ 起始于 "^h…...
spark03-读取文件数据分区数量个数原理
代码val conf: SparkConf new SparkConf().setMaster("local").setAppName("wordcount")val sc: SparkContext new SparkContext(conf)val rdd: RDD[String] sc.textFile("datas/1.txt",2)rdd.saveAsTextFile("output")数据格式 &a…...
操作系统(day08)内存
存储单元 内存的几个基本概念 存储单元 内存地址从0开始,每个地址对应一个存储单元 存储单元大小根据计算机按照什么方式编址 按字节编址 则每个存储单元大小为一字节,即1B,即8个二进制位按字编址 看这个计算的字长是多少位,如…...
11- 聚类算法 (KMeans/DBSCAN/agg) (机器学习)
聚类算法 聚类算法和降维算法那都属于无监督算法。KMeans 是以一个值为中心, 然后所有其他点到该点距离最小值的累积和。 kmeans KMeans(n_clusters3) # n_clusters 分类数量 kmeans.fit(data.iloc[:,1:]) # 无监督,只需要给数据X就可以 DBSCAN 算法是…...
日日顺供应链|想要看清供应链发展趋势,先回答这三个问题
技术变革如何支撑供应链及管理服务的发展? 数字化与科技化开始承托供应链管理能力的升级与变革? 如何从客户需求的纬度反推供应链及管理服务的模式变革?在过去的三年中,我国的供应链企业经受了最为极端的挑战,但当下&a…...
5守护进程与线程
进程组 多个进程的集合,第一个进程就是组长,组长进程的PID等于进程组ID。 进程组生存期:进程组创建到最后一个进程离开(终止或转移到另一个进程组)。与组长进程是否终止无关。 一个进程可以为自己或子进程设置进程组 ID 相关函数 pid_t …...
EZ-Cube简易款下载器烧写使用方法
一、硬件连接 跟目标芯片接4根线 VCC、GND、TOOL、REST 四根线,如果板子芯片自己外接电源的,VCC 线可以不接。 二、 安装烧写软件和驱动 烧写软件:https://download.csdn.net/download/Stark_/87444744?spm1001.2014.3001.5503 驱动程序&a…...
sql server安装并SSMS连接
博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞ÿ…...
Python_pytorch (二)
python_pytorch 小土堆pytotch学习视频链接 from的是一个个的包(package) import 的是一个个的py文件(file.py) 所使用的一般是文件中的类(.class) 第一步实例化所使用的类,然后调用类中的方法(def) Torchvision 数据集 数据集使用(CI…...
java手机短信验证,并存入redis中,验证码时效5分钟
目录 1、注册发送短信账号一个账号 2、打开虚拟机,将redis服务端打开 3、创建springboot工程,导入相关依赖 4、写yml配置 5、创建controller层,并创建controller类 6、创建service层,并创建service类 7、创建工具类&#x…...
kubectl命令控制远程k8s集群(Windows系统、Ubuntu系统、Centos系统)
文章目录1. 本地是linux2. 本地是Windows1. 本地是linux 安装kubectl命令 法一:从master的/usr/bin目录下拷贝kubectl文件到本机/usr/bin目录下法二:GitHub下载kubectl文件 在家目录下创建.kube目录config文件 法一:将master上对应用户的~/.…...
【求解器-COPT】COPT的版本更新中,老版本不能覆盖的问题
【求解器-COPT】COPT的版本更新中,老版本不能覆盖的问题方法1方法2如果license还是找不到作者:刘兴禄 参考网址: COPT的下载和配置步骤如下: 教程 | Windows系统下如何安装COPT求解器并配置许可文件: https://zhuan…...
Vue3.0文档整理:一、简介
1.1:什么是vue? Vue是一款用于构建用户界面的javascript框架;它基于标准HTML、CSS和Javascript构建,并提供了一套声明式、组件化的编程模型,帮助你高效的开发用户界面。 1.2:MVVM工作原理 MVVM指的是model、view和vie…...
vue2 diff算法及虚拟DOM
概括:diff算法,虚拟DOM中采用的算法,把树形结构按照层级分解,只比较同级元素,不同层级的节点只有创建和删除操作。 一、虚拟DOM (1) 什么是虚拟DOM? 虚拟 DOM (Virtual DOM,简称 VDOM) 是一种…...
Ray和极客们的创新之作,2月18日来发现
所在论坛:数据库技术创新&云原生论坛分享时段:2.18 10:30-11:00分享主题:云原生数据库PieCloudDB :Unbreakable安全特性剖析分享嘉宾:王淏舟,拓数派资深研发工程师 由中国开源软件推进联盟PostgreSQL分…...
Dubbo 源码分析 – 集群容错之 Router
1. 简介 上一篇文章分析了集群容错的第一部分 – 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由。上一篇文章关于服务路由相关逻辑没有细致分析,一笔带过了,本篇文章将对此进行详细的分析。首先&…...
行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测)
行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测) 目录 行人检测(人体检测)3:Android实现人体检测(含源码,可实时人体检测) 1. 前言 2. 人体检测数据集说明 3. 基于YOLOv5的人体检测模型训练 4.人体检测模型…...
wordpress编辑php.ini/建站系统有哪些
看了vimrc怎么看都看不出不一样 最后才知道root用户下vi就是vi,而不是vim 只有vim才能使用语法 不信可以用which vi看一看...
获取网站状态/seo销售
if语句一个if语句包含一个布尔表达式和一条或多条语句。语法If语句的用语法如下:if(布尔表达式){//如果布尔表达式为true将执行的语句}如果布尔表达式的值为true,则执行if语句中的代码块。否则执行If语句块后面的代码。public class Test {public static…...
网站开发公司比较有名/南昌seo数据监控
原文地址:The how and why on React’s usage of linked list in Fiber to walk the component’s tree原文作者:Max Koretskyi译文出自:阿里云翻译小组译文链接:https://github.com/dawn-plex/translate/blob/master/articles/th…...
wordpress开发优势/上海今天刚刚发生的新闻
//oracle中extract()函数从oracle 9i中引入,用于从一个date或者interval类型中截取到特定的部分//语法如下:EXTRACT ({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }| { TIMEZONE_HOUR | TIMEZONE_MINUTE }| { TIMEZONE_REGION | TIMEZONE_ABBR }FROM { date_val…...
企业局域网的组建与网站建设论文/营销方案案例范文
今天分享一份来自中国移动的《5G落地:应用融合与创新》。如需下载《5G落地:应用融合与创新》,请扫码前往我们公众号对话框回复“落地”。ps:链接有效期至3月5日,建议尽快下载保存哦!编辑:陈颖思…...
安卓4.3网站开发兼容/汕头网站建设方案维护
我是表哥Harker,表妹我来咯~ 京东的流式布局其实就是把以前我们写死的固定值换成百分比,百分比好处就是子盒子能随着盒子的宽度改变而自动适应。 今天讲解flex布局,这个布局很重要哦,移动端开发80%以上要用到这个布局,并且这个布局一般和后面要说的 rem+媒体查询 一起使…...