爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      《MySQL高级篇》十一、事务基础知识

      首页 知识中心 数据库 文章详情页

      《MySQL高级篇》十一、事务基础知识

      2023-06-06 05:57:21 阅读次数:111

      java,mysql,数据库

      1. 数据库事务概述

      事务是数据库区别于文件系统的重要特性之一,当有了事务就会让数据库始终保持一致性,同时还能通过事务的机制恢复到某个时间点,这样可以保证已提交到数据库的修改不会因为系统崩溃而丢失

      1.1 存储引擎支持情况

      SHOW ENGINES 命令来查看当前 MySQL 支持的存储引擎都有哪些,以及这些存储引擎是否支持事务。

      《MySQL高级篇》十一、事务基础知识

      能看出在MysQL中,只有InnoDB是支持事务的

      1.2 基本概念

      **事务:**一组逻辑操作单元(一组SQL),使数据从一种状态变换到另一种状态。比如下面的转账的两条SQL~

      事务处理的原则:保证所有事务都作为 一个工作单元 来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交( commit ),那么这些修改就 永久 地保存下来;要么数据库管理系统将 放弃 所作的所有 修改 ,整个事务回滚( rollback )到最初状态。

      #案例: AA用户给BB用户转账100
      UPDATE accounts SET money = money - 50 WHERE NAME = 'AA';
      #服务器宕机
      UPDATE accounts SET money = money + 50 WHERE NAME = 'BB';
      

      1.3 事务的ACID特性

      • 原子性(atomicity)

      原子性是指事务是一个不可分割的工作单位,要么全部提交,要么全部失败回滚。即要么转账成功,要么转账失败,是不存在中间的状态。如果无法保证原子性会怎么样?就会出现数据不一致的情形,A账户减去100元,而B账户增加100元操作失败,系统将无故丢失100元。

      • 一致性(consistency)

      (国内很多网站上对一致性的阐述有误,具体你可以参考wikipedia对Consistency的阐述)

      根据定义,一致性是指事务执行前后,数据从一个合法性状态变换到另外一个合法性状态。这种状态是语义上的而不是语法上的,跟具体的业务有关。

      那什么是合法的数据状态呢?满足预定的约束的状态就叫做合法的状态。通俗一点,这状态是由你自己来定义的(比如满足现实世界中的约束)。满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的!如果事务中的某个操作失败了,系统就会自动撤销当前正在执行的事务,返回到事务操作之前的状态。

      **举例1:**A账户有200元,转账300元出去,此时A账户余额为-100元。你自然就发现了此时数据是不一致的,为什么呢?因为你定义了一个状态,余额这列必须>=0。

      **举例2:**A账户200元。转账50元给B账户,A账户的钱扣了,但是B账户因为各种意外,余额并没有增加。你也知道此时数据是不一致的,为什么呢?因为你定义了一个状态,要求A+B的总余额必须不变。

      **举例3:**在数据表中将姓名字段设置为唯一性约束,这时当事务进行提交或者事务发生回滚的时候,如果数据表中的姓名不唯一,就破坏了事务的一致性要求。

      • 隔离型(isolation)

      (可以联系JUC中的临界区的概念,为了避免各个线程都执行临界区的代码,必须加synchronized)

      事务的隔离性是指一个事务的执行不能被其他事务干扰 ,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

      如果无法保证隔离性会怎么样?假设A账户有200元,B账户0元。A账户往B账户转账两次,每次金额为50元,分别在两个事务中执行。如果无法保证隔离性,会出现下面的情形:

      UPDATE accounts SET money = money - 50 WHERE NAME = 'AA';
      UPDATE accounts SET money = money + 50 WHERE NAME = 'BB';
      

      根据图解,发现出现了线程安全的问题,从而导致转账前后总金额不一致的情况~

      《MySQL高级篇》十一、事务基础知识

      • 持久性(durability)

      持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的 ,接下来的其他操作和数据库故障不应该对其有任何影响。

      持久性是通过 事务日志 来保证的。日志包括了 重做日志 和 回滚日志 。当我们通过事务对数据进行修改的时候,首先会将数据库的变化信息记录到重做日志中,然后再对数据库中对应的行进行修改。这样做的好处是,即使数据库系统崩溃,数据库重启后也能找到没有更新到数据库系统中的重做日志,重新执行,从而使事务具有持久性。

      总结
      ACID是事务的四大特性,在这四个特性中,原子性是基础,隔离性是手段,一致性是约束条件,而持久性是目的。

      数据库事务,其实就是数据库设计者为了方便起见,把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称为一个事务。一句话,事务就是ACID~

      1.4 事务的状态

      我们现在知道 事务 是一个抽象的概念,它其实对应着一个或多个数据库操作,MySQL根据这些操作所执行的不同阶段把 事务 大致划分成几个状态:

      • 活动的(active)

      事务对应的数据库操作正在执行过程中时,就说该事务处在 活动的 状态。比如转账的事务(两条DML)在执行~

      • 部分提交的(partially committed)

      当事务中的最后一个操作执行完成,但由于操作都在内存中执行,所造成的影响并 没有刷新到磁盘时,我们就说该事务处在 部分提交的 状态。比如转账的事务执行完成,但是还没有进行提交

      • 失败的(failed)

      当事务处在 活动的 或者 部分提交的 状态时,可能遇到了某些错误(数据库自身的错误、操作系统错误或者直接断电等)而无法继续执行,或者人为的停止当前事务的执行,就说该事务处在失败的状态。 比如正在转账时,银行突然断电了,事务就会被停止。

      • 中止的(aborted)

      如果事务执行了一部分而变为 失败的 状态,那么就需要把已经修改的事务中的操作还原到事务执行前的状态。换句话说,就是要撤销失败事务对当前数据库造成的影响。把这个撤销的过程称之为 回滚 。当 回滚 操作执行完毕时,也就是数据库恢复到了执行事务之前的状态,就说该事务处在了 中止的 状态。比如当事务执行失败后,需要进行回滚,回滚完毕后的状态就是中止态

      举例:

      UPDATE accounts SET money = money - 50 WHERE NAME = 'AA';
      UPDATE accounts SET money = money + 50 WHERE NAME = 'BB';
      
      • 提交的(committed)

      当一个处在 部分提交的状态的事务将修改过的数据都 同步到磁盘 上之后,就可以说该事务处在了 提交的 状态。

      一个基本的状态转换图如下所示:

      《MySQL高级篇》十一、事务基础知识

      图中可见,只有当事务处于 提交的 或者 中止的 状态时,一个事务的生命周期才算是结束了。对于已经提交的事务来说,该事务对数据库所做的修改将永久生效,对于处于中止状态的事务,该事务对数据库所做的所有修改被回滚到没执行该事务之前的状态。

      2. 如何使用事务

      使用事务有两种方式,分别为显式事务和隐式事务

      2.1 显式事务

      事务的完成过程

      • 步骤1:开启事务:
      • 步骤2:一系列的DML操作
      • …
      • 步骤3:结束的状态:提交的状态(COMMIT)、中止的状态(ROLLBACK)

      步骤1: START TRANSACTION 或者 BEGIN ,作用是显式开启一个事务。

      BEGIN;
      #或者
      START TRANSACTION;
      

      START TRANSACTION 语句相较于 BEGIN 特别之处在于,后边能跟随几个 修饰符 :

      ① READ ONLY :标识当前事务是一个 只读事务 ,也就是属于该事务的数据库操作只能读取数据,而不能修改数据。

      补充:只读事务中只是不允许修改那些其他事务也能访问到的表中的数据,对于临时表来说(使用CREATE TMEPORARY TABLE创建的表),由于它们只能在当前会话中可见,所以只读事务其实也是可以对临时表进行增、删、改操作的

      ② READ WRITE :标识当前事务是一个读写事务 ,也就是属于该事务的数据库操作既可以读取数据,也可以修改数据。

      ③ WITH CONSISTENT SNAPSHOT :启动一致性读。

      举例:

      START TRANSACTION READ ONLY;#开启一个只读事务
      START TRANSACTION READ ONLY,WITH CONSISTENT SNAPSHOT;#开启只读事多和一致性读
      START TRANSACTION READ WRITE,WITH CONSISTENT SNAPSHOT;#开启读写事务和一致性读
      

      注意:

      READ ONLY和READ WRITE是用来设置所谓的事务访问模式的,就是以只读还是读写的方式来访问数据库中的数据,一个事务的访问模式不能同时既设置为只读的又设置为读写的,所以不能同时把READ ONLY和READ WRITE放到START TRANSACTION语句后边

      如果不显式指定事务的访问模式,那么该事务的访问模式就是读写模式。

      步骤2:一系列事务中的操作(主要是DML,不含DDL)

      一系列事务中的操作(主要是DML,不含DDL)

      步骤3:提交事务 或 中止事务(即回滚事务)

      # 提交事务。当提交事务后,对数据库的修改是永久性的
      COMMIT;
      # 回滚事务。即撤销正在进行的所有没有提交的修改
      ROLLBACK;
      # 将事务回滚到某个保存点
      ROLLBACK TO [SAVEPOINT]
      

      其中关于SAVEPOINT相关操作有:

      #在事务中创建保存点,方便后续针对保存点进行回滚。一个事务中可么存在多个保存点
      SAVEPOINT 保存点名称;
      #删除某个保存点
      RELEASE SAVEPOINT保存点名称;
      

      2.2 隐式事务

      MySQL中有一个系统变量 autocommit :

      mysql> SHOW VARIABLES LIKE 'autocommit';
      +---------------+-------+
      | Variable_name | Value |
      +---------------+-------+
      |   autocommit  |   ON  |
      +---------------+-------+
      1 row in set (0.01 sec)
      

      默认情况下,如果不显式的使用START TRANSACTION或者BEGIN语句开启一个事务,那么每一条语句都算是一个独立的事务,这种特性称之为事务的自动提交。下边这两条语句就相当于放到两个独立的事务中去执行

      # 假设此时autocommit是默认值
      UPDATE account SET balance = balance - 10 WHERE id = 1; #此时这条DML操作是一个独立的事务
      UPDATE account SET balance = balance + 10 WHERE id = 2; #此时这条DML操作是一个独立的事务
      

      当然,如果想关闭这种 自动提交 的功能,可以使用下边两种方法之一:

      • 显式的的使用 START TRANSACTION 或者BEGIN语句开启一个事务。这样在本次事务提交或者回滚前会暂时关闭掉自动提交的功能。
      • 把系统变量autocommit 的值设置为OFF ,就像这样:
      SET autocommit = OFF;
      #或
      SET autocommit = 0;
      

      这样的话,写入的多条语句就算是属于同一个事务了,直到我们显式的写出COMMIT语句来把这个事务提交掉,或者显式的写出ROLLBACK语句来把这个事务回滚掉。

      补充: Oracle 默认不自动提交,需要手写COMMIT命令,而MySQL 默认自动提交。

      2.3 隐式提交数据的情况

      • 数据定义语言(Data definition language,缩写为:DDL)
        数据库对象,指的就是数据库、表、视图、存储过程等结构。当使用CREATE 、ALTER、DROP等语句去修改数据库对象时,就会隐式的提交前边语句所属于的事务。即:
      BEGIN;
      
      SELECT ... #事务中的一条语句
      UPDATE ...#事务中的一条语句
      ...  #事务中的其它语句
      
      CREATE TABLE ...# 此语句会隐式的提交前边语句所属于的事务
      
      • 隐式使用或修改mysql数据库中的表
        当使用ALTER USER、CREATE USER、DROP USER 、GRANT、RENAME USER、REVOKE、SET PASSWORD等语句时也会隐式的提交前边语句所属于的事务

      • 事务控制或关于锁定的语句

        ① 当在一个事务还没提交或者回滚时就又使用START TRANSACTION或者BEGIN语句开启了另一个事务时,会隐式的提交上—个事务。即:

      BEGIN;
      
      SELECT ... #事务中的一条语句
      UPDATE ... #事务中的一条语句
      ...       #事务中的其它语句
      
      BEGIN;   #此语句会隐式的提交前面语句所属于的事务
      

      ② 当前的 autocommit 系统变量的值为 OFF ,我们手动把它调为 ON 时,也会 隐式的提交 前边语句所属的事务。
      ③ 使用 LOCK TABLES 、 UNLOCK TABLES 等关于锁定的语句也会 隐式的提交 前边语句所属的事务。

      • 加载数据的语句
        使用LOAD DATA语句来批量往数据库中导入数据时,也会隐式的提交前边语句所属的事务。

      • 关于MySQL复制的一些语句
        使用START SLAVE、STOP SLAVE、RESET SLAVE、CHANGE MASTER TO等语句时会隐式的提交前边语句所属的事务。

      • 其它的一些语句

        使用ANALYZE TABLE、CACHE INDEX、CHECK TABLE、FLUSH、LOAD INDEX INTO CACHE 、OPTIMIZE TABLE、REPAIR TABLE、RESET 等语句也会隐式的提交前边语句所属的事务。

      2.4 使用举例1:提交与回滚

      我们看下在 MySQL 的默认状态下,下面这个事务最后的处理结果是什么。

      先创建user3表

      USE atguigudb2;
      CREATE TABLE user3(NAME VARCHAR(15) PRIMARY KEY);
      
      • 情况一:
      BEGIN;
      INSERT INTO user3 VALUES('张三'); #此时不会自动提交数据
      COMMIT;
      
      BEGIN; #开启一个新的事务
      INSERT INTO user3 VALUES('李四'); #此时不会自动提交数据
      INSERT INTO user3 VALUES('李四'); #受主键的影响,不能添加成功
      ROLLBACK;
      
      SELECT * FROM user3;
      /*
      +--------+
      | NAME   |
      +--------+
      | 张三   |
      +--------+
      */
      
      • 情况二:
      TRUNCATE TABLE user3;  #DDL操作会自动提交数据,不受autocommit变量的影响。
      
      BEGIN;
      INSERT INTO user3 VALUES('张三'); #此时不会自动提交数据
      COMMIT;
      
      INSERT INTO user3 VALUES('李四');# 默认情况下(即autocommit为true),DML操作也会自动提交数据。
      INSERT INTO user3 VALUES('李四'); #事务的失败的状态
      
      ROLLBACK;
      
      SELECT * FROM user3;
      /*
      +--------+
      | NAME   |
      +--------+
      | 张三   |
      | 李四   |
      +--------+
      */
      
      • 情况三:
      TRUNCATE TABLE user3;  #DDL操作会自动提交数据,不受autocommit变量的影响。
      
      SELECT @@completion_type;
      
      SET @@completion_type = 1;
      
      BEGIN;
      INSERT INTO user3 VALUES('张三'); 
      COMMIT;
      
      
      SELECT * FROM user3;
      
      INSERT INTO user3 VALUES('李四');
      INSERT INTO user3 VALUES('李四'); 
      
      ROLLBACK;
      
      
      SELECT * FROM user3;
      /*
      +--------+
      | NAME   |
      +--------+
      | 张三   |
      +--------+
      */
      

      能看到相同的SQL代码,只是在事务开始之前设置了SET @@completion_type = 1;结果就和第一次处理的一样,只有一个“张三”。这是为什么呢?
      这里讲解下 MySQL中completion_type参数的作用,实际上这个参数有3种可能:

      • completion=0,这是默认情况。当执行COMNIT的时候会提交事务,在执行下一个事务时,还需要使START TRANSACTION 或者BEGIN来开启。
      • completion=1,这种情况下,当提交事务后,相当于执行了COMMIT AND CHAIN,也就是开启一个链式事务,即提交事务之后会开启一个相同隔离级别的事务。
      • completion=2,这种情况下CONMMIT=COMMIT AND RELEASE,也就是提交后,会自动与服务器断开连接

      当我们设置 autocommit=0 时,不论是否采用 START TRANSACTION 或者 BEGIN 的方式来开启事务,都需要用 COMMIT 进行提交,让事务生效,使用 ROLLBACK 对事务进行回滚。

      当我们设置 autocommit=1 时,每条 SQL 语句都会自动进行提交。 不过这时,如果你采用 START TRANSACTION 或者 BEGIN 的方式来显式地开启事务,那么这个事务只有在 COMMIT 时才会生效,在 ROLLBACK 时才会回滚。

      链事务跳转到4.分类

      2.5 使用举例2:测试不支持事务的Engine

      1、创建测试的表

      USE atguigudb3;
      #举例2:体会INNODB 和 MyISAM
      
      CREATE TABLE test1(i INT) ENGINE = INNODB;
      
      CREATE TABLE test2(i INT) ENGINE = MYISAM;
      

      2、针对于innodb表,ROLLBACK 会生效~

      BEGIN
      INSERT INTO test1 VALUES (1);
      ROLLBACK;
      
      # 执行完,发现表为空,说明回滚成功~
      SELECT * FROM test1;
      

      3、针对于myisam表:不支持事务,BEGIN、ROLLBACK 这些都会失效~

      BEGIN
      INSERT INTO test2 VALUES (1);
      ROLLBACK;
      
      # 执行完,发现表中有上面插入的记录,说明MyISAM不支持事务~
      SELECT * FROM test2;
      

      2.6 使用举例3:SAVEPOINT

      1、创建测试表,并简单测试

      CREATE TABLE user3(NAME VARCHAR(15),balance DECIMAL(10,2));
      
      BEGIN
      INSERT INTO user3(NAME,balance) VALUES('张三',1000);
      COMMIT;
      
      # 执行完,发现表中有上面插入的记录,说明默认创建的表是InnoDB的~
      SELECT * FROM user3;
      

      2、测试SAVEPOINT

      # 开启事务
      BEGIN;
      UPDATE user3 SET balance = balance - 100 WHERE NAME = '张三';
      
      UPDATE user3 SET balance = balance - 100 WHERE NAME = '张三';
      
      #设置保存点(类似于虚拟机的快照)
      SAVEPOINT s1;
      
      UPDATE user3 SET balance = balance + 1 WHERE NAME = '张三';
      
      #回滚到保存点
      ROLLBACK TO s1; 
      
      # 执行完,发现balance=800,说明回滚到保存点s1成功~
      SELECT * FROM user3;
      
      # 由于我们还么有commit,所以本次可以 对此次事务彻底回滚~
      ROLLBACK; #回滚操作
      
      # 执行完,发现balance=1000,说明回滚成功~
      SELECT * FROM user3;
      

      3. 事务隔离级别

      MySQL是一个 客户端/服务器 架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称为一个会话( Session )。每个客户端都可以在自己的会话中向服务器发出请求语句,一个请求语句可能是某个事务的一部分,也就是对于服务器来说可能同时处理多个事务。事务有 隔离性 的特性,理论上在某个事务 对某个数据进行访问 时,其他事务应该进行 排队 ,当该事务提交之后,其他事务才可以继续访问这个数据。但是这样对 性能影响太大 ,我们既想保持事务的隔离性,又想让服务器在处理访问同一数据的多个事务时 性能尽量高些 ,那就看二者如何权衡取舍了

      3.1 数据准备

      创建一个表:

      CREATE TABLE student (
        studentno INT,
        name VARCHAR(20),
        class varchar(20),
        PRIMARY KEY (studentno)
      ) Engine=InnoDB CHARSET=utf8;
      

      然后向这个表里插入一条数据:

      INSERT INTO student VALUES(1, '小谷', '1班');
      

      现在表里的数据就是这样的:

      select * from student;
       /*
      +-----------+--------+-------+
      | studentno | name   | class  |
      +-----------+--------+-------+
      | 1         | 小谷    | 1班   |
      +-----------+--------+-------+
      */
      

      3.2 数据并发问题

      针对事务的隔离性和并发性怎么做取舍呢?先看一下访问相同数据的事务在 不保证串行执行 (也就是执行完一个再执行另一个)的情况下可能会出现哪些问题:

      1、脏写( Dirty Write )

      对于两个事务 Session A、Session B,如果事务Session A 修改了 另一个 未提交 事务Session B 修改过 的数据,那就意味着发生了 脏写

      《MySQL高级篇》十一、事务基础知识

      Session A和Sessione各开启了一个事务,Session B中的事务先将studentno列为1的记录的name列更新为李四,然后Session A中的事务接着又把这条studentno列为1的记录的name列更新为张三’。如果之后Session B中的事务进行了回滚,那么Session A中的更新也将不复存在,这科现象就称之为脏写。

      这时Session A中的事务就没有效果了,明明把数据更新了,最后也提交事务了,最后看到的数据什么变化也没有。这里大家对事务的隔离级比较了解的话,会发现默认隔离级别下,上面SessionA中的更新语句会处于等待状态,这里只是跟大家说明一下会出现这样现象。

      2、脏读( Dirty Read )

      对于两个事务 Session A、Session B,Session A 读取 了已经被 Session B 更新 但还 没有被提交 的字段。之后若 Session B 回滚 ,Session A 读取 的内容就是 临时且无效 的。

      《MySQL高级篇》十一、事务基础知识

      Session A和Session B各开启了一个事务,Session B中的事务先将studentno列为1的记录的name列更新为’张三’,然后Session A中的事务再去查询这条studentno为1的记录,如果读到列name的值为’张三’,而Session B中的事务稍后进行了回滚,那么Session A中的事务相当于读到了一个不存在的数据,这种现象就称之为 脏读 。

      3、不可重复读( Non-Repeatable Read )

      对于两个事务Session A、Session B,Session A 读取 了一个字段,然后 Session B 更新 了该字段。 之后Session A 再次读取同一个字段, 值就不同 了。那就意味着发生了不可重复读。

      《MySQL高级篇》十一、事务基础知识

      在Session B中提交了几个 隐式事务 (注意是隐式事务,意味着语句结束事务就提交了),这些事务都修改了studentno列为1的记录的列name的值,每次事务提交之后,如果Session A中的事务都可以查看到最新的值,这种现象也被称之为 不可重复读 。

      4、幻读( Phantom )

      对于两个事务Session A、Session B, Session A 从一个表中 读取 了一个字段, 然后 Session B 在该表中 插入 了一些新的行。 之后, 如果 Session A 再次读取 同一个表, 就会多出几行。那就意味着发生了幻读。

      《MySQL高级篇》十一、事务基础知识

      Session A中的事务先根据条件 studentno > 0这个条件查询表student,得到了name列值为’张三’的记录;之后Session B中提交了一个 隐式事务 ,该事务向表student中插入了一条新记录;之后Session A中的事务再根据相同的条件 studentno > 0查询表student,得到的结果集中包含Session B中的事务新插入的那条记录,这种现象也被称之为 幻读 。我们把新插入的那些记录称之为幻影记录。

      注意1:
      有的同学会有疑问,那如果Session B中删除了一些符合studentno > 的记录而不是插入新记录,那SessionA之后再根据studentno > 0的条件读取的记录变少了,这种现象算不算幻读呢?这种现象不属于幻读,幻读强调的是一个事务按照某个相同条件多次读取记录时,后读取时读到了之前没有读到的记录。

      注意2:
      那对于先前已经读到的记录,之后又读取不到这种情况,算啥呢? 这相当于对每一条记录都发生了不可重复读的现象。幻读只是重点强调了读取到了之前读取没有获取到的记录

      3.3 SQL中的四种隔离级别

      上面介绍了几种并发事务执行过程中可能遇到的一些问题,这些问题有轻重缓急之分,我们给这些问题按照严重性来排一下序:

      脏写 > 脏读 > 不可重复读 > 幻读
      

      我们愿意舍弃一部分隔离性来换取一部分性能在这里就体现在:设立一些隔离级别,隔离级别越低,并发问题发生的就越多。 SQL标准 中设立了4个 隔离级别 :

      • READ UNCOMMITTED :读未提交,在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。不能避免脏读、不可重复读、幻读。

      • READ COMMITTED :读已提交,它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。可以避免脏读,但不可重复读、幻读问题仍然存在。

      • REPEATABLE READ :可重复读,事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。可以避免脏读、不可重复读,但幻读问题仍然存在。这是MySQL的默认隔离级别。

      • SERIALIZABLE :可串行化,确保事务可以从一个表中读取相同的行。在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除操作。所有的并发问题都可以避免,但性能十分低下。能避免脏读、不可重复读和幻读。

      SQL标准 中规定,针对不同的隔离级别,并发事务可以发生不同严重程度的问题,具体情况如下:

      《MySQL高级篇》十一、事务基础知识

      YES表示没有解决

      脏写 怎么没涉及到?因为脏写这个问题太严重了,不论是哪种隔离级别,都不允许脏写的情况发生。

      不同的隔离级别有不同的现象,并有不同的锁和并发机制,隔离级别越高,数据库的并发性能就越差,4种事务隔离级别与并发性能的关系如下:

      《MySQL高级篇》十一、事务基础知识

      3.4 MySQL支持的四种隔离级别

      不同的数据库厂商对SQL标准中规定的四种隔离级别支持不一样。比如,Oracle就只支持READ COMNITTED(默认隔离级别)和SERIALIZABLE隔离级别。MySQL虽然支持4种隔离级别,但与SQL标准中所规定的各级隔离级别允许发生的问题却有些出入,MySQL在REPEATABLE READ隔离级别下,是可以禁止幻读问题的发生的,禁止幻读的原因在第16章讲解。

      MySQL的默认隔离级别为REPEATABLE READ,可以手动修改一下事务的隔离级别

      # 查看隔离级别,MySQL 5.7.20的版本之前:
      SHOW VARIABLES LIKE 'tx_isolation';
      /*
      +---------------+-----------------+
      | Variable_name | Value           |
      +---------------+-----------------+
      | tx_isolation | REPEATABLE-READ  |
      +---------------+-----------------+
      */
      
      # MySQL 5.7.20版本之后,引入transaction_isolation来替换tx_isolation
      
      # 查看隔离级别,MySQL 5.7.20的版本及之后:
      SHOW VARIABLES LIKE 'transaction_isolation';
      /*
      +-----------------------+-----------------+
      | Variable_name         | Value           |
      +-----------------------+-----------------+
      | transaction_isolation | REPEATABLE-READ |
      +-----------------------+-----------------+
      */
      
      #或者不同MySQL版本中都可以使用的:
      SELECT @@transaction_isolation;
      /*
      +-------------------------+
      | @@transaction_isolation |
      +-------------------------+
      | REPEATABLE-READ         |
      +-------------------------+
      */
      

      3.5 如何设置事务的隔离级别

      1、通过下面的语句修改事务的隔离级别:

      SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL 隔离级别;
      #其中,隔离级别格式:
      > READ UNCOMMITTED
      > READ COMMITTED
      > REPEATABLE READ
      > SERIALIZABLE
      

      或者

      SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别'
      #其中,隔离级别格式:
      > READ-UNCOMMITTED
      > READ-COMMITTED
      > REPEATABLE-READ
      > SERIALIZABLE
      

      2、关于设置时使用GLOBAL或SESSION的影响:

      ①使用GLOBAL关键字(在全局范围影响):

      SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
      #或
      SET GLOBAL TRANSACTION_ISOLATION = 'SERIALIZABLE';
      

      则:

      • 当前已经存在的会话无效
      • 只对执行完该语句之后产生的会话起作用

      ②使用 SESSION 关键字(在会话范围影响):

      SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
      #或
      SET SESSION TRANSACTION_ISOLATION = 'SERIALIZABLE';
      

      则:

      • 对当前会话的所有后续的事务有效
      • 如果在事务之间执行,则对后续的事务有效
      • 该语句可以在已经开启的事务中间执行,但不会影响当前正在执行的事务

      如果在服务器启动时想改变事务的默认隔离级别,可以修改启动参数transaction_isolation的值。比如,在启动服务器时指定了transaction_isolation=SERIALIZABLE,那么事务的默认隔离级别就从原来的REPEATABLE-READ变成了 SERIALIZABLE。

      小结:

      数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。

      3、演示global

      • 开启会话A

      《MySQL高级篇》十一、事务基础知识

      • 再开启另一个会话B

      《MySQL高级篇》十一、事务基础知识

      • 会话A中退出mysql,再登录,会发现设置的隔离级别已经生效了~

      msql服务器重启 systemctl restart mysqld 后,隔离级别又重新回到默认~ 毕竟咱们设置的都是在内存级别的~

      4、演示session

      • 会话A中

      《MySQL高级篇》十一、事务基础知识

      • 会话B中,事务隔离级别也变更成了我们设置的那个~

      3.6 不同隔离级别举例

      1、创建数据表,并初始化数据

      use atguigudb3;
      create table account(
        id INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(15),
        balance DECIMAL(15)
      );
      
      INSERT INTO account VALUES(1 ,'张三', '100'),(2,'李四', '0');
      

      2、在Xshell中开两个Session,模拟两个事务~

      3、将两个session中的隔离级别都设置成read-uncommitted

      《MySQL高级篇》十一、事务基础知识

      4、演示1. 读未提交之脏读

      • 案例一

      《MySQL高级篇》十一、事务基础知识

      《MySQL高级篇》十一、事务基础知识

      之后事务1进行回滚,事务2读取的数据就回到了 100~

      • 案例二

      《MySQL高级篇》十一、事务基础知识

      5、演示2:读已提交

      • 环境准备
      mysql> truncate table account;
      Query OK, 0 rows affected (0.02 sec)
      
      mysql> INSERT INTO account VALUES(1 ,'张三', '100'),(2,'李四', '0');
      Query OK, 2 rows affected (0.01 sec)
      Records: 2  Duplicates: 0  Warnings: 0
      
      mysql> select * from account;
      +----+--------+---------+
      | id | name   | balance |
      +----+--------+---------+
      |  1 | 张三   |     100 |
      |  2 | 李四   |       0 |
      +----+--------+---------+
      2 rows in set (0.01 sec)
      
      • 将两个session的隔离级别设置为:read-committed
      mysql> set session transaction_isolation = 'read-committed';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> select @@transaction_isolation;
      +-------------------------+
      | @@transaction_isolation |
      +-------------------------+
      | READ-COMMITTED          |
      +-------------------------+
      1 row in set (0.00 sec)
      
      • 演示图解

      《MySQL高级篇》十一、事务基础知识

      6、演示三、可重复读

      • 将两个session的隔离级别设置为:repeatable-read
      mysql> set session transaction_isolation = 'repeatable-read';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> select @@transaction_isolation;
      +-------------------------+
      | @@transaction_isolation |
      +-------------------------+
      | REPEATABLE-READ         |
      +-------------------------+
      1 row in set (0.00 sec)
      
      • 演示图解

      《MySQL高级篇》十一、事务基础知识

      7、演示四、幻读

      《MySQL高级篇》十一、事务基础知识

      《MySQL高级篇》十一、事务基础知识

      这里要灵活的理解读取的意思。第一次select是读取,第二次的insert其实也属于隐式的读取,只不过是在mysql的机制中读取的,插入数据也是要先读取一下有没有主键冲突才能决定是否执行插入

      幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select某记录是否存在,不存在,准备插入此记录,但执行insert时发现此记录已存在,无法插入,此时就发生了幻读(如上图所示)。

      在RR隔离级别下,step1、step2是会正常执行的,step3则会报错主键冲突,对于事务B的业务来说是执行失败的,这里事务B就是发生了幻读,因为事务B在step1中读取的数据状态并不能支撑后续的业务操作,事务B:“见鬼了,我刚才读到的结果应该可以支持我这样操作才对啊,为什么现在不可以"。事务B不敢相信的又执行了step4,发现和step1读取的结果是一样的(RR下的 MVCC机制)。此时,幻读无疑已经发生,事务B无论读取多少次,都查不到id=3的记录,但它的确无法插入这条他通过读取来认定不存在的记录(此数据已被事务A插入),对于事务B来说,它幻读了。

      其实RR(Mysql默认隔离级别)也是可以避免幻读的,通过对select操作手动加行X锁(独占锁) (SELECT … FOR UPDATE这也正是SERIALIZABLE 隔离级别下会隐式为你做的事情),同时,即便当前记录不存在,比如id = 3是不存在的,当前事务也会获得一把记录锁(因为InnoDB的行锁锁定的是索引,故记录实体存在与否没关系,存在就加行X锁,不存在就加间隙锁),其他事务则无法插入此索引的记录,故杜绝了幻读。

      在SERIALIZABLE隔离级别下,step1执行时是会隐式的添加行(X)锁/gap(X)锁的,从而step2会被阻塞,step3 会正常执行,待事务1提交后,事务2才能继续执行(主键冲突执行失败),对于事务1来说业务是正确的,成功的阻塞扼杀了扰乱业务的事务2,对于事务1来说他前期读取的结果是可以支撑其后续业务的。

      所以MySQL的幻读并非什么读取两次返回结果集不同,而是事务在插入事先检测不存在的记录时,惊奇的发现这些数据已经存在了,之前的检测读获取到的数据如同鬼影一般

      补充:隔离级别是 SERIALIZABLE 时的效果:

      《MySQL高级篇》十一、事务基础知识

      4. 事务的常见分类

      从事务理论的角度来看,可以把事务分为以下几种类型:

      • 扁平事务(Flat Transactions)
      • 带有保存点的扁平事务(Flat Transactions with Savepoints)
      • 链事务(Chained Transactions)
      • 嵌套事务(Nested Transactions)
      • 分布式事务(Distributed Transactions)

      下面简单介绍这几种类型:

      1)扁平事务是事务类型中最简单的一种,但是在实际生产环境中,这可能是使用最频繁的事务,在扁平事务中,所有操作都处于同一层次,其由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束,其间的操作是原子的,要么都执行,要么都回滚,因此,扁平事务是应用程序成为原子操作的基本组成模块。扁平事务虽然简单,但是在实际环境中使用最为频繁,也正因为其简单,使用频繁,故每个数据库系统都实现了对扁平事务的支持。扁平事务的主要限制是不能提交或者回滚事务的某一部分,或分几个步骤提交。

      扁平事务一般有三种不同的结果:①事务成功完成。在平常应用中约占所有事务的96%。②应用程序要求停止事务。比如应用程序在捕获到异常时会回滚事务,约占事务的3%。③外界因素强制终止事务。如连接超时或连接断开,约占所有事务的1%。

      2)带有保存点的扁平事务除了支持扁平事务支持的操作外,还允许在事务执行过程中回滚到同一事务中较早的一个状态。这是因为某些事务可能在执行过程中出现的错误并不会导致所有的操作都无效,放弃整个事务不合乎要求,开销太大。

      保存点(Savepoint)用来通知事务系统应该记住事务当前的状态,以便当之后发生错误时,事务能回到保存点当时的状态。对于扁平的事务来说,隐式的设置了一个保存点,然而在整个事务中,只有这一个保存点,因此,回滚只能会滚到事务开始时的状态。

      3)链事务是指一个事务由多个子事务链式组成,它可以被视为保存点模式的一个变种。带有保存点的扁平事务,当发生系统崩溃时,所有的保存点都将消失,这意味着当进行恢复时,事务需要从开始处重新执行,而不能从最近的一个保存点继续执行。链事务的思想是:在提交一个事务时,释放不需要的数据对象,将必要的处理上下文隐式地传给下一个要开始的事务,前一个子事务的提交操作和下一个子事务的开始操作合并成一个原子操作,这意味着下一个事务将看到上一个事务的结果,就好像在一个事务中进行一样。这样,在提交子事务时就可以释放不需要的数据对象,而不必等到整个事务完成后才释放。其工作方式如下:

      《MySQL高级篇》十一、事务基础知识

      链事务与带有保存点的扁平事务的不同之处体现在:

      ①带有保存点的扁平事务能回滚到任意正确的保存点,而链事务中的回滚仅限于当前事务,即只能恢复到最近的一个保存点。

      ②对于锁的处理,两者也不相同,链事务在执行COMMIT后即释放了当前所持有的锁,而带有保存点的扁平事务不影响迄今为止所持有的锁。

      4)嵌套事务是个层次结构框架,由一个顶层事务(Top-Level Transaction)控制着各个层次的事务,顶层事务之下嵌套的事务被称为子事务(Subtransaction),其控制着每一个局部的变换,子事务本身也可以是嵌套事务。因此,嵌套事务的层次结构可以看成是一棵树。

      5)分布式事务通常是在一个分布式环境下运行的扁平事务,因此,需要根据数据所在位置访问网络中不同节点的数据库资源。例如,一个银行用户从招商银行的账户向工商银行的账户转账1000元,这里需要用到分布式事务,因为不能仅调用某一家银行的数据库就完成任务。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/LXYDSF/article/details/128710384,作者:爱编程的大李子,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:《MySQL高级篇》十三、锁

      下一篇:mysql中,表person有字段id、name、age、sex,id是主键,name是普通索引,age和sex没有索引。select * from person where i

      相关文章

      2025-05-19 09:05:01

      项目更新到公网服务器的操作步骤

      项目更新到公网服务器的操作步骤

      2025-05-19 09:05:01
      公网 , 数据库 , 文件 , 更新 , 服务器
      2025-05-19 09:04:53

      Django rest froamwork-ModelSerializer

      Django rest froamwork-ModelSerializer

      2025-05-19 09:04:53
      django , sqlite , 数据库
      2025-05-19 09:04:38

      mysql只有在任务处于完成状态才能运行

      mysql只有在任务处于完成状态才能运行

      2025-05-19 09:04:38
      MySQL , 任务 , 数据库 , 查询 , 状态
      2025-05-19 09:04:30

      设置28401事件后启动数据库时报错ORA-49100

      设置28401事件后启动数据库时报错ORA-49100

      2025-05-19 09:04:30
      ORA , 数据库 , 时报
      2025-05-14 10:03:13

      MySQL 索引优化以及慢查询优化

      MySQL 是一种广泛使用的关系型数据库管理系统,因其性能优异和使用便捷而备受欢迎。然而,随着数据量的增长和查询复杂度的增加,性能瓶颈也变得越来越明显。

      2025-05-14 10:03:13
      MySQL , 优化 , 使用 , 性能 , 数据库 , 查询 , 索引
      2025-05-14 10:03:05

      Oracle数据库用户权限分析

      Oracle数据库用户权限分析

      2025-05-14 10:03:05
      Oracle , 分析 , 数据库 , 权限 , 用户
      2025-05-14 10:02:58

      java休眠到指定时间怎么写

      java休眠到指定时间怎么写

      2025-05-14 10:02:58
      java , sleep , Thread , util , 方法
      2025-05-14 10:02:58

      java项目多端数据同步解决方案

      多端数据同步是指在多个设备(例如桌面应用、移动应用、Web应用)之间保持数据的一致性。

      2025-05-14 10:02:58
      java , Spring , WebSocket , 同步 , 数据 , 版本号
      2025-05-14 10:02:48

      互斥锁解决redis缓存击穿

      在高并发系统中,Redis 缓存是一种常见的性能优化方式。然而,缓存击穿问题也伴随着高并发访问而来。

      2025-05-14 10:02:48
      Redis , 互斥 , 数据库 , 线程 , 缓存 , 请求
      2025-05-14 10:02:48

      SQL Server 事务日志体系结构1--基本术语

      事务包括对数据库的一次更改或一系列更改。它有一个明确开始和明确结束。开始时使用BEGIN TRANSACTION语句,或者SQL Server会自动为您开始一个事务。

      2025-05-14 10:02:48
      Server , SQL , 事务 , 数据库 , 日志 , 磁盘
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5252229

      查看更多

      最新文章

      Django rest froamwork-ModelSerializer

      2025-05-19 09:04:53

      mysql只有在任务处于完成状态才能运行

      2025-05-19 09:04:38

      设置28401事件后启动数据库时报错ORA-49100

      2025-05-19 09:04:30

      MySQL 索引优化以及慢查询优化

      2025-05-14 10:03:13

      Oracle数据库用户权限分析

      2025-05-14 10:03:05

      SQL Server 账号管理1

      2025-05-14 10:02:48

      查看更多

      热门文章

      Windows下使用批处理实现启动关闭mysql

      2023-04-24 11:27:05

      cdh安装到scm-server的mysql报错处理

      2023-04-28 02:38:44

      Nacos数据持久化到MySQL

      2023-05-12 07:20:56

      python学习——使用MySQL

      2023-04-27 07:57:16

      MySQL的间隙锁

      2023-05-12 07:20:56

      正确理解Mysql的列索引和多列索引

      2023-05-12 07:20:42

      查看更多

      热门标签

      数据库 mysql 字符串 数据结构 MySQL 算法 redis oracle java sql python 数据 索引 SQL 查询
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Nacos数据持久化到MySQL

      06-Redis哨兵

      windows下基于docker安装mongodb

      修改profile实现资源限制

      Lc1047_删除字符串中的所有相邻重复项

      EF:插入记录失败,提示当 IDENTITY_INSERT 设置为 OFF 时,不能向表中的标识列插入显式值

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号