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

【MySQL-7】事务

目录

1. 整体学习思维导图

2. 什么是事务

2.1 事务的概念

2.2 事务的属性(ACID)

2.3 事务出现的原因

2.4 查看存储引擎对事务的支持

3. 事务的使用

3.1 事务的提交方式

3.1.1 手动提交

3.1.2 自动提交

结论:

3.2 事务的隔离级别

3.2.1 理解隔离

3.2.2 设置隔离级别

3.2.3 隔离级别

读未提交(Read Uncommitted)

读提交(Read Committed)

可重复读(Repeatable Read)

串行化(Serializable)

总结:

4. 隔离性和隔离级别的理解

4.1 数据库的并发场景

4.2 读-写场景并发(MVCC)理解

4.2.1 事务ID

4.2.2 三个隐藏记录字段

4.2.3 undo日志

模拟MVCC:

探讨:

4.3 当前读和快照读

4.3.1 Read View

4.4 RR与RC的区别:


1. 整体学习思维导图

2. 什么是事务

2.1 事务的概念

事务是从应用层面上来看待的,比如在一个同学退学了,我们需要在学校的教务系统的数据库中将该同学的信息,选课,成绩都要删除掉,这需要一系列的SQL语句,而我们就把这个处理的DML语句集合称作为一个事务!

2.2 事务的属性(ACID)

  • 原子性(Atomicity):一个事务的所有操作要么全部执行,要么全部未执行,不能出现中间的状态。就拿前面的比方同学退学,我们的退学事务不能只说删除同学的信息,但不去删除选课和成绩!如果一个事务在执行过程中发生错误,那么该事务就会回滚(rollback)到没执行的状态!

  • 一致性(Consistency):事务的执行结果是可以预期的,比如A向B转账50,那么A的账户会减少50,B的账户会增加50,A向B转账的过程就是一个事务,而这个事务的结果是可以预期的就称作为一致性。MySQL对于一致性并没有做过多的设计,MySQL是通过AID来保证C一致性的,简单说AID是因,C是果。

  • 隔离性(Isolation):每个事务执行的期间是隔离的,数据库允许多个并发的事务对数据进行读写操作,隔离性可以防止多个事务在读写数据交叉导致数据的不一致。

    • 隔离性的级别(根据隔离影响划分)

    • 读未提交(Read UnCommitted)

    • 读提交(Read Committed)

    • 可重复读(repeatable read)

    • 串行化(Serializable)

  • 持久性(Durability):事务处理结束之后,对于数据的修改是永久性的,即使系统故障也不会丢失。

查看事务隔离级别:

查看全局:

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+
1 row in set, 1 warning (0.00 sec)

 查看当前会话:

mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ        |
+------------------------+
1 row in set, 1 warning (0.00 sec)

查看默认: 

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

2.3 事务出现的原因

事务的本质是一系列的DML语句,但是我们在应用层编写时不可能时常去注意细节,我们可以用面向对象的思想来解释,而事务就相当于一个对象,它将DML语句描述后组织起来。

我们还将MySQL中的一条信息称作为一条记录。

2.4 查看存储引擎对事务的支持

mysql> show engines \G;
*************************** 1. row ***************************Engine: InnoDBSupport: DEFAULTComment: Supports transactions, row-level locking, and foreign keys
Transactions: YES     -- 对事务支持XA: YESSavepoints: YES
*************************** 2. row ***************************Engine: MRG_MYISAMSupport: YESComment: Collection of identical MyISAM tables
Transactions: NO     -- 对事务不支持XA: NOSavepoints: NO

3. 事务的使用

3.1 事务的提交方式

  • 手动提交

  • 自动提交

3.1.1 手动提交

我们先创建一个测试表:

create table if not exists T_TB( id int primary key comment'编号', name varchar(20) default'', age tinyint  
);

手动提交和自动提交互不影响,下面是手动提交的开启/结束: 

begin/start transaction
commit;

手动创建回滚点: 

mysql> savepoint save1; Query OK, 0 rows affected (0.00 sec)-- 创建一个保存点save1
mysql> rollback to save1; -- 回滚到保存点save1 

  • 如果手动开始的事务没有提交,程序崩溃后会自动回滚;手动开始事务提交后即使程序崩溃也会持久化保存

  • 自动提交的开启是否不影响手动提交!

3.1.2 自动提交

查看自动提交是否开启:OFF(没有开启)/ON(开启)

mysql> show variables like'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

自动提交开启后,我们正常进行一条条CURD操作都是一个个事务,即使程序异常崩溃也会持久化保存;如果关闭自动提交进行CURD操作,我们程序异常崩溃后会回滚!

所以操作能否对数据进行持久化的影响取决于是否提交了!

结论:

 

3.2 事务的隔离级别

3.2.1 理解隔离

  • 隔离性:数据库中,为了保证事务执行过程中尽量不受干扰,就有了一个重要特征隔离性。

  • 隔离级别:数据库中,允许事务受不同程度的干扰,就有了一种重要特征隔离级别 。

3.2.2 设置隔离级别

我们前面讲了如何查看隔离级别,这边我们来看如何设置隔离级别:

--设置
-- 设置当前会话 or 全局隔离级别语法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED(读未提交) | READ
COMMITTED(读提交) | REPEATABLE READ(可重复读) | SERIALIZABLE(串行化)}  
  • 当前会话:只作用于这一次会话,一旦退出就消失!

  • 全局:更新完全局隔离级别需要重启MySQL才会生效!

3.2.3 隔离级别

读未提交(Read Uncommitted)

在该隔离级别下,两个事务并发读写数据,其中一方事务进行读操作,另一方事务进行写操作读操作的事务可以实时看到写操作事务对数据的修改(即使写操作事务并没有进行提交),我们将读操作事务读取到的数据称作为脏读(因为写操作事务没有提交cmmit,我们是不知道读取的数据是否会回滚rollback)!

读提交(Read Committed)

在该隔离级别下,两个事务并发读写数据时,任何一方想看到另外一方的修改需要等对方提交才可以,但是它会带来一个问题--不可重复度,不可重复读是指原本我们的数据内容只有三条记录,我们第一次读取也是三条,与此同时另一个事务进行了insert并且结束了事务,我们这边的事务又进行了一次查询发现表中的数据改变成了四条,与前面的三条不相符,我们将这种现象称作为不可重复读

可重复读(Repeatable Read)

在该隔离级别下,两个事务并发读写数据时,任何一方在事务过程中都不会影响到另一个事务,即使第一个事务已经结束DML操作,但是第二个事务是无法看到进过操作后的表。只有双方都结束并且commit,才可以看到对方的修改。

  • 多次查看,发现终端A在对应事务中insert的数据,在终端B的事务周期中,也没有什么影响,也符合可重复的特点。但是,一般的数据库在可重复读情况的时候,无法屏蔽其他事务insert的数据(为什么?因为隔离性实现是对数据加锁完成的,而insert待插入的数据因为并不存在,那么一般加锁无法屏蔽这类问题),会造成虽然大部分内容是可重复读的,但是insert的数据在可重复读情况被读取出来,导致多次查找时,会多查找出来新的记录,就如同产生了幻觉。这种现象,叫做幻读(phantom read)。

串行化(Serializable)

在该隔离级别下,两个事务并发读写数据时,两个事务就需要进行排队执行,只有在对方提交完成后另一方才可以进行相应的操作(读取数据不受影响)。

 我们可以看见更新SQL语句卡住了。

 当我们右边事务提交后,卡住的SQL执行成功!

 

总结:
  • 隔离级别越高,安全性越好,但是数据库的并发性能就会降低,我们需要根据需求找到一个平衡点。

  • 不可重复读重点在于修改和删除

  • 幻读的重点在于新增的数据

4. 隔离性和隔离级别的理解

4.1 数据库的并发场景

  • 读-读:不存在问题

  • 读-写:存在问题,可能会出现(脏读/幻读/不可重复读)

  • 写-写:存在问题

4.2 读-写场景并发(MVCC)理解

我们先来理解数据库中出现并发场景最多的读-写场景。

多版本并发控制(MVCC)是一种解决读-写问题的无锁并发控制。

在理解MVCC之前我们需要来学习一些前置知识点:

  1. 三个隐藏记录字段

  2. undo日志

  3. Read View

4.2.1 事务ID

每个事务都要有自己的ID,ID决定他们到来的先后顺序。

MySQL可能有时并发的处理多个事务,事务也就有了自己的生命周期,那么我们就需要对事务进行先描述在组织,通过一个对象或者结构体将事务管理起来!

4.2.2 三个隐藏记录字段

  • DB_TRX_ID:称作为最近修改事务ID,记录创建这条记录/最后一次修改(修改/插入)该记录的事务ID 。

  • DB_ROLL_PTR: 称作为回滚指针,用于指向该条记录的上个版本。

  • DB_ROW_ID:隐含的自增ID(隐藏主键),如果数据表没有主键, InnoDB 会自动以DB_ROW_ID 产生一个聚簇索引

补充:还有一个flag字段用于表示该条记录是否删除,比如说1表示删除,0表示存在。记录的更新和删除不一定是真的删除了!

-- 我们创建一个测试表,只有姓名和年龄
mysql> create table if not exists T_MVCC(-> name varchar(15),-> age int unsigned-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into T_MVCC values('张三', 18);
Query OK, 1 row affected (0.00 sec)mysql> select * from T_MVCC limit 1;
+--------+------+
| name   | age  |
+--------+------+
| 张三   |   18 |
+--------+------+
1 row in set (0.00 sec)

我们将隐藏的字段也添加上,DB_TRX_ID默认null,DB_ROLL_PTR默认null,DB_ROW_ID默认1。 

name

age

DB_TRX_ID

DB_ROLL_PTR

DB_ROW_ID

张三

18

null

null

1

4.2.3 undo日志

我们需要知道MySQL数据库在我们对数据进行的操作短时内都是在内存中执行的,根据算法过一定的时间或者满足一定的条件,数据才会被从内存向磁盘上写入!

而undo log就是存放在内存缓冲区用于日志信息!

模拟MVCC:

  1. 前提条件:我们需要将张三的age修改为20(update)。

在事务ID: 1修改前,给该条记录加上行锁,然后拷贝一份旧版本到undo log中,等待事务1提交后,解锁。修改后的事务ID: 1中的PTR指向上个版本,这样可以方便进行回滚操作!

而我们可以将undo log中的版本称作为一个个快照!

探讨:

  • 对于删除delete,我们前面介绍过flag,所以删除也可以形成一个版本进行存放,在执行删除操作时,内部存放的是与之相反的添加的SQL,一旦回滚就执行该SQL。

  • 对于插入insert,insert插入的是之前版本没有的数据,按前面来看insert是无法形成一个旧版本的,但是为了回滚操作,insert的数据也要被存放到undo log中,只有当commit后,insert存到的数据才会被清空!

  • 对于select呢?我们什么时候读当前最新的数据(当前读)还是去读取旧数据(快照读)呢?我们下面来详细看看:

4.3 当前读和快照读

控制当前读还是快照读,取决于隔离级别!我们虽然说事务的属性是原子性的,但是在MySQL处理事务的过程中也是存在先后的顺序,而这个顺序将决定读取数据的版本和范围!

可以简单说当前读还是快照读,一个事务该读取那些版本的数据,也就是隔离级别实现的本质。

4.3.1 Read View

  • Read View就是事务进行 快照读 操作的时候生产的 读视图 (Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)

  • Read View 在 MySQL 源码中,就是一个类,本质是用来进行可见性判断的。 我们创建一个事务的时候不会创建Read View, 只有当我们某个事务执行快照读(select)的时候,对该记录创建一个 Read View 读视图,把它比作条件,用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也有可能是该行记录的 undo log 里面的某个版本的数据。

Read View类的主要成员变量

m_ids;         // 相当于一张列表记录当前活跃的事务的ID
up_limit_id;   // 用于记录m_ids表中最小的事务ID
low_limit_id;  // 用于记录所有事务中(包括已经commit的)最大的ID值+1
creator_trx_id //创建该ReadView的事务ID

通过上图:

在m_ids表中的ID存在: 1 2 3

up_limit_id:1

low_limit_id: 5

creator_trx_id: 2

事务4修改操作后,id是不存在于m_ids,并且也不大于low_limit_id,快照读是可见事务4的版本。

4.4 RR与RC的区别:

  • select * from user lock in share mode ,以加共享锁方式进行读取,对应的就是当前读,该条语句可以读到最新的版本。

RR: 一个Read View用到底 RC: 每次快照读都会更新Read View

比方说我们现在存在着事务A,事务B:

 

 

  • 我们先以RR做举例:事务B在快照读时生成的Read View中的m_ids中存放着事务A的ID,所以事务B是看不见事务A的修改版本,即使提交后,由于RR一个Read View用到底的原因,AID还在m_ids依旧不可见!

  • 反观RC,每次更新Read View,虽然第一次事务A的ID在m_ids中不可见其版本,但是后续提交后再次快照读生成新的Read View事务A的ID不存在m_ids并且满足查看的条件,所以快照读的版本就是事务A的版本。

相关文章:

【MySQL-7】事务

目录 1. 整体学习思维导图 2. 什么是事务 2.1 事务的概念 2.2 事务的属性(ACID) 2.3 事务出现的原因 2.4 查看存储引擎对事务的支持 3. 事务的使用 3.1 事务的提交方式 3.1.1 手动提交 3.1.2 自动提交 结论: 3.2 事务的隔离级别 3.2.1 理解隔离 3.2.2…...

03链表+栈+队列(D1_链表(D1_基础学习))

目录 一、什么是链表 二、基本操作 三、为什么要使用链表 四、为什么能够在常数时间访问数组元素 数组优点 数组缺点 五、动态数组诞生 链表优点 链表缺点 六、链表、数组和动态数组的对比 七、 链表种类 1. 单向链表 2. 双向链表 3. 循环链表 八、链表衍生 ...…...

Git 出现 Please use your personal access token instead of the password 解决方法

目录 前言1. 问题所示2. 原理分析3. 解决方法前言 1. 问题所示 执行Git提交代码的时候,出现如下所示: lixiaosong@IT07 MINGW64 /f/java_project/JavaDemo (master) $ git push -u origin --all libpng warning: iCCP: known incorrect sRGB profile libpng warning...

AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念 N-Gram模型是一种基于统计的语言模型,用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说,N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意:这…...

STM32新建不同工程的方式

新建工程的方式 1. 安装开发工具 MDK5 / keil52. CMSIS 标准3. 新建工程3.1 寄存器版工程3.2 标准库版工程3.3 HAL/LL库版工程3.4 HAL库、LL库、标准库和寄存器对比3.5 库开发和寄存器的关系 4. STM32CubeMX工具的作用 1. 安装开发工具 MDK5 / keil5 MDK5 由两个部分组成&#…...

【Rust自学】14.5. cargo工作空间(Workspace)

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 14.4.1. 为什么需要cargo workspace 假如说我们构建了一个二进制crate,里面既有library又有库。随着项目规模不断增长&#…...

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto,AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代,Web3 AIGC(AI生成内容)和 AI Agent(人工智能代理)正成为两大关键赛道。 AIGC 通过 AI 技术生成…...

10.3 LangChain实战指南:解锁大模型应用的10大核心场景与架构设计

LangChain实战指南:解锁大模型应用的10大核心场景与架构设计 关键词: LangChain使用场景、LLM应用案例、检索增强生成、智能体开发、知识库问答 一、LangChain场景全景图:从简单到复杂的应用分层 #mermaid-svg-nzjpyXIPLzL0j3PG {font-family:"trebuchet ms",ver…...

Swing使用MVC模型架构

什么是MVC模式? MVC是一组英文的缩写,其全名是Model-View-Controller,也就是“模型-视图-控制器”这三个部分组成。这三个部分任意一个部分发生变化都会引起另外两个发生变化。三者之间的关系示意图如下所示: MVC分为三个部分,所以在MVC模型中将按照此三部分分成三…...

设计新的 Kibana 仪表板布局以支持可折叠部分等

作者:来自 Elastic Teresa Alvarez Soler, Hannah Mudge 及 Nathaniel Reese 在 Kibana 中构建可折叠仪表板部分需要彻底改造嵌入式系统并创建自定义布局引擎。这些更新改进了状态管理、层次结构和性能,同时为新的高级仪表板功能奠定了基础。 我们正在开…...

修改maven的编码格式为utf-8

1.maven默认编码为GBK 注:配好MAVEN_HOME的环境变量后,在运行cmd. 打开cmd 运行mvn -v命令即可. 2.修改UTF-8为默认编码. 设置环境变量 变量名 MAVEN_OPTS 变量值 -Xms256m -Xmx512m -Dfile.encodingUTF-8 3.保存,退出cmd.重新打开cmd 运行mvn -v命令即可. 源码获取&…...

解锁罗技键盘新技能:轻松锁定功能键(罗技K580)

在使用罗技键盘的过程中,你是否曾因 F11、F12 功能键的默认设置与实际需求不符而感到困扰? 别担心,今天就为大家分享一个简单实用的小技巧 —— 锁定罗技键盘的 F11、F12 功能键,让你的操作更加得心应手! 通常情况下…...

HTB:Active[RE-WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 将靶机TCP开放端口号提取并保存 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用nmap对靶机…...

[C语言日寄] 源码、补码、反码介绍

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...

安卓逆向之脱壳-认识一下动态加载 双亲委派(一)

安卓逆向和脱壳是安全研究、漏洞挖掘、恶意软件分析等领域的重要环节。脱壳(unpacking)指的是去除应用程序中加固或保护措施的过程,使得可以访问应用程序的原始代码或者数据。脱壳的重要性: 分析恶意软件:很多恶意软件…...

Nuxt:利用public-ip这个npm包来获取公网IP

目录 一、安装public-ip包1.在Vue组件中使用2.在Nuxt.js插件中使用public-ip 一、安装public-ip包 npm install public-ip1.在Vue组件中使用 你可以在Nuxt.js的任意组件或者插件中使用public-ip来获取公网IP。下面是在一个Vue组件中如何使用它的例子&#xff1a; <template…...

babylon.js-3:了解STL网格模型

网格模型上色 本篇文章主要介绍如何在 BabylonJS 中实现STL网格模型上色。 文章目录 网格模型上色运用场景概要延申正文加载器库的支持认识 OBJ 和 STL 文件GUI 色板选择器网格模型异步加载加载动画网格模型上色官方即将弃用 ImportMesh 而推荐使用 ImportMeshAsync 说明OBJ …...

基于SpringBoot的假期周边游平台的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

【MySQL】初始MySQL、库与表的操作

目录 基本使用 使用案例 SQL分类 存储引擎 库的操作 字符集和校验规则 查看系统默认字符集和校验规则 查看数据库支持的字符集 查看数据库支持的字符集校验规则 指定编码常见数据库 校验规则对数据库的影响 操纵数据库 库的备份与恢复 表的操作 创建表 查看表 …...

将DeepSeek接入Word,打造AI办公助手

最近&#xff0c;DeepSeek热度一路高涨&#xff0c;成为AI领域的焦点。通过开放的API&#xff0c;我们可以将DeepSeek接入Word&#xff0c;直接进行AI对话。更进一步&#xff0c;还能利用DeepSeek辅助修改文档&#xff0c;甚至提出一些排版建议。 Word报告工具已经新增“DeepS…...

Coze,Dify,FastGPT,对比

在当今 AI 技术迅速发展的背景下&#xff0c;AI Agent 智能体成为了关键领域&#xff0c;Coze、Dify 和 FastGPT 作为其中的佼佼者&#xff0c;各有千秋。 平台介绍 - FastGPT&#xff1a;由环界云计算公司发起&#xff0c;是基于大语言模型&#xff08;LLM&#xff09;的开源…...

Kafka 日志存储 — 磁盘存储

Kafka 依赖与磁盘来存储和缓存消息&#xff0c;采用文件追加的方式来写入消息。顺序写盘的速度快于随机写内存。 1 磁盘存储 除顺序写入外&#xff0c;Kafka中大量使用了页缓存、零拷贝等技术来进一步提升吞吐性能。 1.1 页缓存 页缓存是操作系统实现的一种磁盘缓存&#x…...

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…...

GL C++显示相机YUV视频数据使用帧缓冲FBO后期处理,实现滤镜功能。

一.前言&#xff1a; GitHub地址&#xff1a;GitHub - wangyongyao1989/WyFFmpeg: 音视频相关基础实现 系列文章&#xff1a; 1. OpenGL Texture C 预览Camera视频&#xff1b; 2. OpenGL Texture C Camera Filter滤镜; 3. OpenGL 自定义SurfaceView Texture C预览Camera视…...

【hot100】刷题记录(7)-除自身数组以外的乘积

题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#x…...

解决.NET程序通过网盘传到Linux和macOS不能运行的问题

问题描述&#xff1a;.net程序用U盘传到虚拟机macOS和Linux可以正常运行&#xff0c;但是网盘传过去就不行。 解决方法&#xff1a; 这是文件权限的问题。当你通过U盘将文件传输到虚拟机的macOS和Linux系统时&#xff0c;文件的权限和所有权可能得到了保留或正确设置。但如果…...

练习(复习)

大家好&#xff0c;今天我们来做几道简单的选择题目来巩固一下最近学习的知识&#xff0c;以便我们接下来更好的学习。 这道题比较简单&#xff0c;我们前面学过&#xff0c;在Java中&#xff0c;一个类只能继承一个父类&#xff0c;但是一个父类可以有多个子类&#xff0c;一个…...

Class2(2020):Shell基础(二)——Shell脚本设计基础

本系列博客为MIT的《Missing in CS Class》的课程笔记。 Class2(2020):Shell基础(二)——Shell脚本设计基础 注&#xff1a;若无特殊说明&#xff0c;本文中带有[]的部分均为可选参数。 脚本文件 脚本语言为解释执行&#xff0c;其运行需有解释器&#xff0c;如Python。Shel…...

HBase-2.5.10 伪分布式环境搭建【Mac】

文章目录 前言一、搭建单节点Zookeeper1. 解压zookeeper2. 配置环境变量3. 修改配置文件4. 启动zk 二、搭建伪分布式Hbase1. 解压hbase2. 配置环境变量3. 修改配置4. 启动HBase 前言 搭建hbase伪分布式环境 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例仅供参…...

计算机毕业设计Python+CNN卷积神经网络高考推荐系统 高考分数线预测 高考爬虫 协同过滤推荐算法 Vue.js Django Hadoop 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...