【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)

目录

  • 1. 什么是事务?
  • 2. 事务的版本支持
  • 3. 事务提交的方式
    • 3.1 事务提交方式的分类
    • 3.2 演示的准备的工作
      • 3.2.1 创建表
      • 3.2.2 MySQL的服务端和客户端
      • 3.2.3 调低事务的隔离级别
  • 4. 手动提交
    • 4.1 手动提交的命令说明
    • 4.2 示例一
    • 4.3 示例二
    • 4.4 示例三
    • 4.5 示例四
  • 5. 自动提交
    • 5.1 开启自动提交
    • 5.2 关闭自动提交
  • 6. 手动提交和自动提交的关系

1. 什么是事务?

举一个抢火车票的例子:
在这里插入图片描述
场景一:
当火车票还剩下一张,三个人同时抢票,客户端1强到票了(数据库中的票数变为0),当客户端1进行付钱时突然系统崩溃了,客户端1再次进入到付钱的页面时付钱的时间已经结束了,但是票没有恢复到数据库中,数据库中的票数一直显示为0,系统崩溃一次导致一张车票消失了,三个人都买不了票了。

场景二:
当火车票还剩下一张,三个人同时抢票,客户端1强到票了(数据库中的票数变为没有变为0),当客户端1进行付钱时网络不好,此时客户端2抢到了票并付了钱,此时的数据库票数为0,但是客户端2的网络变好后在付款界面付了钱。这张票算谁的呢?

CURD满足什么属性,能解决上述问题?

  1. 买票的过程是一个单独的整体
  2. 个人买票的时候不能收其他人影响
  3. 买完票应该要永久有效
  4. 买前,和买后都要是确定的状态

什么是事务?
事务就是一组DML语句组成,这些语句在逻辑上存在相关性,这一组DML语句要么全部成功,要么全部失败,是一个整体。MySQL提供一种机制,保证我们达到这样的效果。事务还规定不同的客户端看到的数据是不相同的。

事务就是要做的或所做的事情,主要用于处理操作量大,复杂度高的数据。假设一种场景:你正在注册一个银行账户,你需要在一个页面填入你的姓名、年龄、性别、身份证号等等,在数据库后台中,就需要多条MySQL 语句构成,那么所有这些操作合起来,就构成了一个事务。

正如我们上面所说,一个MySQL 数据库,可不止你一个事务在运行,同一时刻,甚至有大量的请求被包
装成事务,在向MySQL 服务器发起事务处理请求。而每条事务至少一条SQL ,最多很多SQL ,这样如果大
家都访问同样的表数据,在不加保护的情况,就绝对会出现问题。

甚至,因为事务由多条SQL 构成,那么,也会存在执行到一半出错或者不想再执行的情况,那么已经执行的怎么办呢?

所有,一个完整的事务,绝对不是简单的sql 集合,还需要满足如下四个属性:

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中
    间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个
    事务从来没有执行过一样
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完
    全符合所有的预设规则
    ,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工
    作。
  • 隔离性数据库允许多个并发事务同时对其数据进行读写和修改的能力隔离性可以防止多个事务
    并发执行时由于交叉执行而导致数据的不一致
    。事务隔离分为不同级别,包括读未提交(read uncommitted )、读提交(read committed)、可重复读(erializable )、(repeatable read)和串行化
  • 持久性事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失

为什么会出现事务 ?
事务被MySQL 编写者设计出来,本质是为了当应用程序访问数据库的时候,事务能够简化我们的编程,不需要我们去考虑各种各样的潜在错误和并发问题。可以想一下当我们使用事务时,要么提交,要么回滚,我们不会去考虑网络异常了,服务器宕机了,同时更改一个数据怎么办对吧?

因此事务本质上是为了应用层服务的,而不是伴随着数据库系统天生就有的。
备注:我们后面把MySQL 中的一行信息,称为一行记录

2. 事务的版本支持

在 MySQL 中只有使用了 InnoDB 数据库引擎的数据库或表才支持事务,MyISAM不支持事务

查看数据看引擎:

# 查看数据库引擎,以表格的方式显示
show engines; # 查看数据库引擎,以行的方式显示
show engines\G

以表格的方式显示:
在这里插入图片描述

3. 事务提交的方式

3.1 事务提交方式的分类

  1. 按照提交机制分类
  • 显式提交:用户或应用程序显式地发出提交命令(如SQL语句COMMIT;),以结束事务并使事务所做的更改成为永久性的。
  • 隐式提交:数据库系统在满足某些条件时自动提交事务。例如,在执行某些DDL(数据定义语言)语句(如CREATE TABLE, ALTER TABLE等)之后,数据库可能会自动提交当前事务。
  1. 按照事务控制方式分类
  • 自动提交(Auto-commit)在自动提交模式下,每个单独的SQL语句都被视为一个独立的事务,执行完后会立即提交。这意味着每个SQL语句都会立即生效,无需显式地开始和结束事务。自动提交模式适合于那些不需要将多个操作组合成单个事务的情况,例如简单的查询和插入操作
  • 手动提交(Manual commit)手动提交模式要求应用程序显式地开始和结束事务。在这种模式下,用户需要使用BEGIN TRANSACTION;(或类似的命令)开始事务,使用COMMIT;提交事务,或使用ROLLBACK;回滚事务。这种方式提供了更大的灵活性,适用于需要将多个操作组合成一个逻辑单元的情况,确保这些操作要么全部成功,要么全部失败

同学们可能此时有点晕,不用着急,经过下面的例子后思路会慢慢清晰。

3.2 演示的准备的工作

3.2.1 创建表

创建一个表:

create table students(id int primary key,name varchar(10),age tinyint(1)) engine = innodb;

3.2.2 MySQL的服务端和客户端

模拟多个用户同时访问数据库,这里我用两个命令行客户端与服务端建立连接。

MySQL由服务端(Server)和客户端(Client)两部分组成,这两者通过网络进行通信,共同完成数据库的各种操作

建立连接
客户端向服务端发起连接请求,指定服务端的 IP 地址和端口号。
服务端接收到请求后,进行身份验证,验证通过后建立连接。

发送请求
客户端发送 SQL 语句或其他命令到服务端。
服务端解析收到的请求,执行相应的操作。

给同学们看看MySQL的客户端和服务端在哪:
命令:

# 查看MySQL客户端
ls /usr/bin/mysql# 查看MySQL服务端
ls /usr/sbin/mysqld

在这里插入图片描述
以上我们可知,MySQL其实是一套网络服务,底层采用tcp协议
在这里插入图片描述

MySQL是一套网络服务,那么就相当于一个远程的服务器
我们可以使用很多台远端机器连接正在运行着的MySQL服务器。
比如,你同学的电脑上运行着MySQL,你可以使用自己的电脑连接他的MySQL进行操作。

这次示例中我用两个客户端连接一台MySQL服务器:
左侧位客户端1,右侧为客户端2.
在这里插入图片描述

3.2.3 调低事务的隔离级别

默认的隔离级别太高了,我们是为了研究事务,研究事务就要研究多个客户端并发的现象。把隔离级别调成最低,在一个客户端更改数据后,在另一个客户端就能观察到现象。这样能很清楚的看到双方的事务在交叉时带来的问题。

为什么要修改隔离级别的具体原因暂时不讲,当学到事务隔离级别的时候自然会明白。

修改隔离级别为 读不提交(read uncommit):

set global transaction isolation level read uncommmitted;

创建隔离级别后重新登陆客户端1和客户端2。

查询隔离级别:

select @@tx_isolation;

在这里插入图片描述

查看客户端的登录状态

show processlist;

在这里插入图片描述
此时用两个客户端在登录。

4. 手动提交

4.1 手动提交的命令说明

  1. 开始事务

    # 命令1
    start transaction;#命令2
    begin;
    

    开始一个新的事务。在执行这条命令之前,如果有未提交的事务,MySQL 会自动提交当前事务。

  2. 提交事务(commit)

    commit;
    

    提交当前事务,将所有对数据库的更改永久保存

  3. 保存点(savepoint)

    savepoint savepoint_name;
    

    在事务中设置一个保存点。保存点可以让你在事务中部分回滚到某个点,而不是回滚整个事务

  4. 回滚事务(rollback)

    # 回滚到事务开始
    rollback;# 回滚到某一点
    rollback to savepoint_name;
    

    回滚当前事务,撤销所有对数据库的更改

  5. 撤销保存点

    RELEASE SAVEPOINT savepoint_name;
    

    释放指定的保存点。一旦释放,就不能再回滚到该保存点。

4.2 示例一

场景一:

开始事务,
执行命令,创建节点,
执行命令,创建节点,
rollback to 回滚到某一保存点
提交事务

示例:

  1. 在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据

    # 客户端1
    insert into students values(1, '李明', 18);
    # 创建保存点
    savepoint p1;# 客户端2
    select * from students;
    

    在这里插入图片描述

    当一个客户端操作数据后,在另一个客户端可以立即看到。

  2. 在客户端1插入数据,创建保存点;然后在客户端2查询数据

    # 客户端1
    insert into students values(2, '诸葛亮', 20);
    # 创建保存点
    savepoint p2;# 客户端2
    select * from students;
    

    在这里插入图片描述

  3. 在客户端1回滚到保存点p2;然后在另一个客户端查询数据

    # 客户端1
    rollback to p1;# 客户端2
    select * from students;
    

    在这里插入图片描述
    同学们可以发现,查询出的数据变少了,在p1以下执行的命令被撤销了。

  4. 在客户端1提交事务;然后在客户端2查询数据

    # 客户端1
    commit;# 客户端2
    select * from students;
    

    在这里插入图片描述
    同学们可以发现,当客户端1提交事务后,客户端2查询的数据没有发生改变,当客户端2提交事务后,查询的数据还是没发生改变。

总之,事务是单个命令的的集合体;回滚到某一保存点时保留该保存点以上的数据,撤销该保存点以下的数据;提交事务后,对数据的改变已做永久性保存。

4.3 示例二

场景二:
开始事务,
执行命令,创建节点,
执行命令,创建节点,
rollback;
提交事务

  1. 在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据

    # 客户端1
    insert into students values(3, '李刚', 18);
    # 创建保存点
    savepoint p1;# 客户端2
    select * from students;
    
  2. 在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据

    # 客户端1
    insert into students values(4, '白居易', 19);
    # 创建保存点
    savepoint p2;# 客户端2
    select * from students;
    
  3. 在客户端1回滚;然后在客户端2查询数据

    # 客户端1
    rollback;# 客户端2
    select * from students;
    

在这里插入图片描述
同学们可以发现,使用rolback;命令直接回滚到事务开始出,撤销所有的事务操作。

那么,提交事务后仍然是这样吗?
答:是的,回滚后撤销的操作不可以恢复。

# 客户端1
commit;# 客户端2
select * from students; 

在这里插入图片描述

4.4 示例三

场景三:
开始事务,
执行命令,创建节点,
执行命令,创建节点,
提交事务
rollback;

  1. 在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据

    # 客户端1
    insert into students values(3, '李刚', 18);
    # 创建保存点
    savepoint p1;# 客户端2
    select * from students;
    

    在这里插入图片描述

  2. 在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据

    # 客户端1
    insert into students values(4, '白居易', 19);
    # 创建保存点
    savepoint p2;# 客户端2
    select * from students;
    

    在这里插入图片描述

  3. 在客户端1提交事务;然后在客户端2查询数据

    # 客户端1
    commit;# 客户端2
    select * from students;
    

    在这里插入图片描述

  4. 在客户端1回滚;然后在客户端2查询数据

    # 客户端1
    rollback;# 客户端2
    select * from students;
    

    在这里插入图片描述
    同学们可以发现,提交事务后再回滚是没有作用的,提交事务后,对数据的改变已做永久性保存。

4.5 示例四

场景四:
开始事务,
执行命令,创建节点,
执行命令,创建节点,
客户端崩溃(CTRL + D 模拟崩溃)

  1. 在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据

    # 客户端1
    insert into students values(5, '李世民', 19);
    # 创建保存点
    savepoint p1;# 客户端2
    select * from students;
    

    在这里插入图片描述

  2. 在客户端1开始事务,并插入数据,创建保存点;然后在客户端2查询数据

    # 客户端1
    insert into students values(6, '程咬金', 20);
    # 创建保存点
    savepoint p2;# 客户端2
    select * from students;
    
  3. 在客户端1模拟崩溃;然后在客户端2查询数据

    # 客户端1
    `CRRL + D`# 客户端2
    select * from students;
    

    在这里插入图片描述
    步骤3模拟的是客户1端崩溃,同学们可以发现,当客户端1在事务中崩溃后,客户端2查询不到该事务操作的数据。也就是说,当客户端在事务操作中崩溃后,会撤销该事务的所有操作,即回滚到该事务的开始

5. 自动提交

5.1 开启自动提交

自动提交不需要任何的手动,最开始学习时写的SQL命令就是自动提交的。当我们不手动写begin/commit时,写的每一个SQL命令也都是事务,只不过写什么就提交什么。

  1. 开启自动提交(MySQL数据库默认开启)

    set autocommit = 1;
    
  2. 查询自动提交是否开启

    select @@autocommit;
    

    在这里插入图片描述
    1表示开启,0表示关闭。

示例:

  1. 客户端1正常的往表格中插入数据,然后客户端2查询数据

    # 客户端1
    insert into students values(1,'李明', 18);# 客户端2
    select * from students; 
    

    在这里插入图片描述
    当你正常使用 MySQL 并且不手动使用事务时,MySQL 会默认处于自动提交模式。这意味着每个单独的 SQL 语句都会立即提交,而不是等待显式的提交命令。

  2. 客户端1正常的往表格中插入数据,然后客户端2查询数据,当客户端1崩溃后,客户端再次查询数据

    # 客户端1
    insert into students values(5,'李世民', 19);# 客户端2
    select * from students; # 客户端1,模拟崩溃
    `CTRL + D` 
    

    在这里插入图片描述
    我们可以发现,使用自动提交的时候,当客户端1崩溃后,进行操作的数据是不会丢失的,在客户端2依然能查询到已经操作的数据。

5.2 关闭自动提交

当关闭自动提交(autocommit)后,你需要显式地使用 COMMIT 命令来提交事务。这样可以确保你的更改被永久保存到数据库中。如果没有显式地提交事务,那么在事务中的所有更改都不会被保存,直到你显式地提交或回滚事务

  1. 关闭自动提交(MySQL数据库默认开启)

    set autocommit = 0;
    
  2. 查询自动提交是否开启

    select @@autocommit;
    

    在这里插入图片描述

示例:

客户端1正常的往表格中插入数据,然后客户端2查询数据

# 客户端1
insert into students values(6,'程咬金', 20);# 客户端2
select * from students; 

在这里插入图片描述
此时插入的数据在客户端2可以查询到,但是真的是永久保存下来了吗?
答:不是

模拟客户端1崩溃,然后用客户端2查询

# 客户端1
`CTRL + D`# 客户端2
select * from students;

在这里插入图片描述
同学们可以发现,当客户端1崩溃后,在客户端2就查询不到操作的数据了。
这是因为关闭自动提交后,每次的操作都不会是永久的保存,只用使用commit才可以永久的保存下来。

插入刚才没有成功插入的数据:

# 客户端1
insert into students values(6,'程咬金', 20);
commit;
`CTRL + D`# 客户端2
select * from students; 

在这里插入图片描述
当客户端1插入数据后并执行commit后,客户端1崩溃,但是在客户端2依然可以查询到插入的操作。事务提交commit让数据永久的保存了下来。

6. 手动提交和自动提交的关系

我在演示手动提交的实验时开启了自动提交,

但是,

自动提交 autocommit=1/0 不会影响手动事务提交(begin/commit),自动提交 与 手动事务提交没有任何关系。

换言之:
如果不手动使用begin,当autocommit=1时自动提交就会起作用,执行一个语句就会提交;当autocommit=0时自动提交就会关闭,执行一个语句需要显示提交,使用commit提交事务

如果手动使用begin,自动提交就会不起作用,当执行命令begin时,未手动执行commit之前,事务就不会提交

总之系统遵循手动优先,自动为辅

当设置 set autocommit = 0,重复上述手动事务的实验,可以发现实验结果和autocommit=1的结果完全一致。

那么autocommit开启和关闭作用是什么呢?

答:当关闭autocommit时,执行命令后必须显示使用commit提交,否则操作的数据不会永久性保存到数据库,即当客户崩溃后之前执行的所有命令都会失效;当开启autocommit时,执行命令后不必手动commit,因为每当执行命令后都会默认自动提交事务

其实,我们执行的所有命令(包括不使用begin/commit的命令)都是事务,人为创建的事务需要使用命令begin/commit,平常的命令只不过没有显示出命令begin/commit,但也是事务。

总结:
系统遵循手动优先,自动为辅。自动提交执行的前提条件是没有手动执行事务的开始

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471755.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis配置文件的增删改查功能

Mybatis配置文件的增删改查功能 查询—条件查询 //resources里面的org.example.mapper中的BrandMapper.xml文件 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://…

Android 项目依赖库无法找到的解决方案

目录 错误信息解析 解决方案 1. 检查依赖版本 2. 检查 Maven 仓库配置 3. 强制刷新 Gradle 缓存 4. 检查网络连接 5. 手动下载依赖 总结 相关推荐 最近&#xff0c;我在编译一个 Android 老项目时遇到了一个问题&#xff0c;错误信息显示无法找到 com.gyf.immersionba…

群控系统服务端开发模式-应用开发-前端登录接口开发

一、修改验证方法 1、修改验证器 loginRules: {username: [{required: true, trigger: blur, validator: validateUsername}],password: [{required: true, trigger: blur, validator: validatePassword}],captcha_code: [{required: true, trigger: blur, validator: validat…

java基础入门学习09-迭代器

文章目录 一、引言二、迭代器2.1 迭代器对象的创建2.2 迭代器的使用 一、引言 迭代器是设计模式的一种&#xff0c;迭代器模式提供方法来访问容器中的的元素&#xff0c;这听起来跟c语言中指针十分相似&#xff0c;其实数组访问中的指针本质上就是迭代器的一种。Iterrator对象…

深度解析:Android APP集成与拉起微信小程序开发全攻略

目录 一、背景以及功能介绍 二、Android开发示例 2.1 下载 SDK 2.2 调用接口 2.3 获取小程序原始Id 2.4 报错提示&#xff1a;bad_param 2.4.1 错误日志 2.4.2 解决方案 相关推荐 一、背景以及功能介绍 需求&#xff1a;产品经理需要APP跳转到公司的小程序(最好指定页…

Python学习26天

集合 # 定义集合 num {1, 2, 3, 4, 5} print(f"num&#xff1a;{num}\nnum数据类型为&#xff1a;{type(num)}") # 求集合中元素个数 print(f"num中元素个数为&#xff1a;{len(num)}") # 增加集合中的元素 num.add(6) print(num) # {1,2,3,4,5,6} # 删除…

python爬虫(二)爬取国家博物馆的信息

import requests from bs4 import BeautifulSoup# 起始网址 url https://www.chnmuseum.cn/zx/xingnew/index_1.shtml # 用于存储所有数据 all_data [] page 1 global_index 1 # 定义全局序号变量并初始化为1 while True:html_url requests.get(url).textif requests.get…

Android 单元测试环境配置问题 Execution failed for task ‘:mergeDebugJavaResource‘.

背景和挑战 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI在各行各业的应用前景被普遍看好。无论是在医疗、金融、教育&#xff0c;还是在软件开发领域&#xff0c;AI都展示出了巨大的潜力。然而&#xff0c;尽管AI能够在许多方面提供支持和提升效率&a…

无人机应用场景:石油管道巡检技术详解

无人机在石油管道巡检中的应用&#xff0c;以其高效、便捷、灵活的特点&#xff0c;为石油管道的安全管理提供了有力支持。以下是对无人机在石油管道巡检技术方面的详细解析&#xff1a; 一、无人机巡检技术的概述 无人机巡检技术是指利用无人机搭载各种传感器和检测设备&…

51c嵌入式~单片机合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信&#xff1f; 下面这个“电平转换”电路&#xff0c;理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途&#xff1a;当两个MCU在不同的工作电压下工作&…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

Qt主线程把数据发给子线程,主线程会阻塞吗

演示&#xff1a; #include <QCoreApplication> #include <QThread> #include <QObject> #include <QDebug>// 子线程类 class Worker : public QObject {Q_OBJECT public slots:void processData(int data) {qDebug() << "Processing dat…

C++内存池实现

1.内存池概念 内存池就和其他的池数据&#xff08;如线程池&#xff09;结构类似&#xff0c;由程序维护一个“池”结构来管理程序使用的内存&#xff0c;然后根据需要从内存池中申请使用内存或者向内存池中释放内存&#xff0c;来达到高效管理内存的目的。 在一般的内存管理的…

STM32设计学生宿舍监测控制系统

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 随着科技的飞速发展和智能化时代的到来&#xff0c;学生宿舍的安全、舒适…

企业如何提高招聘能力?

企业如何提高招聘能力&#xff1f; 许多企业在进行招聘工作时&#xff0c;常常会遇到各种问题和挑战。尽管付出了大量的时间和精力&#xff0c;但结果却并不总是如人意。例如&#xff0c;企业可能会经历一次又一次的面试&#xff0c;却仍然找不到一个能够适应岗位要求的合适人…

大模型在蓝鲸运维体系应用——蓝鲸运维开发智能助手

本文来自腾讯蓝鲸智云社区用户: CanWay 背景 1、运维转型背景 蓝鲸平台从诞生之初&#xff0c;就一直在不遗余力地推动运维转型&#xff0c;让运维团队可以通过一体化PaaS平台&#xff0c;快速编写脚本&#xff0c;编排流程&#xff0c;开发运维工具&#xff0c;从被动地提供…

3588 yolov8 onnx 量化转 rknn 并运行

本教程重点不在如何训练模型&#xff0c;重点是全流程链路&#xff0c;想学训练的可以网上找教程 环境 python 3.10.xrknn-toolkit2-2.2.0ultralytics_yolov8rknn 驱动版本2.2 模型训练 yolov8仓库地址&#xff1a;https://github.com/airockchip/ultralytics_yolov8.git下载…

Vue 组件通信及进阶语法

文章目录 一、scoped 样式冲突二、data 是一个函数三、组件通信1. 父子通信1.1 props 校验1.2 props 比较 data 2. 非父子通信2.1 event bus2.2 provide-inject 四、进阶语法1. v-model 详解2. sync 修饰符3. ref 和 $refs4. $nextTick 一、scoped 样式冲突 注意点&#xff1a;…

LeetCode105.从前序与中序遍历构造二叉树

题目要求 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 提示: 1 < preorder.length < 3000inorder.length preorder.length-3000 < pr…

【问卷调研】HarmonyOS SDK开发者社区用户需求有奖调研

问卷请点击&#xff1a;HarmonyOS SDK开发者社区用户需求有奖调研