• Mysql: COMMIT 和 ROLLBACK


    Mysql: COMMIT 和 ROLLBACK

    在这里插入图片描述

    每博一文案

    天空黑暗到一定程度,星辰就会熠熠生辉,但凡熬过了的,
    都是百毒不侵,我们今天受的苦,吃的亏,担的责,忍的痛
    到最后都会变成光照亮下半场的路。
    当我们熬过所有的苦,就会发现,原来自己比想象中勇敢,原来生活真
    的会苦尽甘来。
    生活总是泥沙俱下,成为自己生命的摆渡人,一边咬牙挣扎,一边负重前行。
    愿你在人生这场路上不畏艰险,像蝴蝶一样一再的蜕变一再的祝愿。
    既不忧虑也不彷徨,既不回顾,也不忧伤,坦然而真诚地活着。
                                   ——————   一禅心灵庙语
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9


    COMMIT 和 ROLLBACK的介绍

    COMMIT : 表示提交数据。一旦执行 COMMIT ,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。

    ROLLBACK :回滚数据。一旦执行 ROLLBACK ,则可以实现数据的回滚,回滚到最近的一次 COMMIT之后。


    TRUNCATE TABLE 和 DELETE FROM

    对比 TRUNCATE TABLEDELETE FROM 的不同与相同点

    相同点: 都可以实现对表中的所有数据的删除,同时保留表结构

    不同点:

    • DDL ——>TRUNCATE TABLE

      1. 一旦执行此操作,表数据全部清除,无法回滚,会自动执行 COMMIT 提交数据的操作。
      2. 这种删除效率比较高,表被一次截断,物理硬盘上删除了。
      3. 这种删除的缺点就是:不支持回滚
      4. 这种删除的优点就是:快速
      5. 不支持单条记录的删除,只能整表删除,就是不可以使用 where 条件的筛选
    • DML ——>DELECT FROM

      1. 一旦执行此操作,表数据可以全部清除,不带 where

      2. 表中的数据被删除,但是这个数据在硬盘上的实质数据是没有被删除的,真实存储的空间不会被释放 !!! 可以通过 在删除前,设置 SET autocommit = FALSE ,实现回滚。

      3. 这种删除的缺点就是:删除效率比较低

      4. 这种删除的优点就是:通过设置可以实现回滚,后悔了,可以再恢复数据 !!!


    DML 和 DDL 的说明

    • DDL 的操作一旦执行,就不可回滚,因为执行了 COMMIT 对数据的提交
    • DML 的操作默认情况:一旦执行,也是不可回滚的,但是如果在执行 DML之前,执行了 SET autocommit = FALSE(取消提交 commit 数据的) 操作,则执行的 DML 操作之前就可以实现回滚。

    DELETE FROM 回滚演示

    下面是对 DELETE FROM 情况表中的数据的一个回滚操作的演示

    -- 1.
    COMMIT;  /* 提交数据 */
    
    • 1
    • 2
    -- 2.
    SELECT *       /* 显示该表中的所有数据 */
    FROM myemp2;
    
    • 1
    • 2
    • 3

    在这里插入图片描述


    -- 3.
    SET autocommit = FALSE;  /* 设定回滚 */
    
    • 1
    • 2
    -- 4.
    DELETE FROM myemp2;   /* 清空myemp2表中的数据 */
    
    • 1
    • 2
    -- 5.
    SELECT *
    FROM myemp2;    /* 查看表中的数据是否清空了 */
    
    • 1
    • 2
    • 3

    在这里插入图片描述


    -- 6.
    ROLLBACK ; /* 回滚数据到 commit 时刻 */
    
    • 1
    • 2
    -- 7.
    SELECT *
    FROM myemp2;  /* 清空的表被 commit 回滚回来了 */
    
    • 1
    • 2
    • 3

    在这里插入图片描述


    完整操作如下:

    -- 1.
    COMMIT;  /* 提交数据 */
    
    -- 2.
    SELECT *       /* 显示该表中的所有数据 */
    FROM myemp2;
    
    -- 3.
    SET autocommit = FALSE;  /* 设定回滚 */
    -- 4.
    DELETE FROM myemp2;   /* 清空myemp2表中的数据 */
    -- 5.
    SELECT *
    FROM myemp2;    /* 查看表中的数据是否清空了 */
    -- 6.
    ROLLBACK ; /* 回滚数据到 commit 时刻 */
    -- 7.
    SELECT *
    FROM myemp2;  /* 清空的表被 commit 回滚回来了 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    TRUNCATE TABLE 回滚演示

    下面是对 TRUNCATE TABLE 情况表中的数据的一个回滚操作的演示

    -- 1.
    COMMIT;  /* 提交数据 */
    
    • 1
    • 2
    -- 2.
    SELECT *
    FROM myemp2;    /* 查看myemp2 表中的数据 */
    
    • 1
    • 2
    • 3
    -- 3.
    SET autocommit = FALSE; /* 设定回滚 */
    
    • 1
    • 2
    -- 4. 
    TRUNCATE TABLE myemp2;  /* 清空myemp2 表中的数据内容 */
    
    • 1
    • 2
    -- 5.
    SELECT *
    FROM myemp2;    /* 查看表数据是否清空 */
    
    • 1
    • 2
    • 3

    在这里插入图片描述


    -- 6. 
    ROLLBACK;   /* 回滚到 commit 时刻 */
    
    • 1
    • 2
    -- 7.
    SELECT *
    FROM myemp2;   /* 查看表中的数据是否,回滚回来 */
    
    • 1
    • 2
    • 3

    在这里插入图片描述


    为什么会回滚失败

    DDL 中的 TRUNCATE TABLE 一旦执行,就不可回滚,指定 SET autocommit = FALSEDDL操作失效。该操作之后,一定会执行一次commit 提交数据。而导致,commit操作不受 SET autocommit = FALSE的影响了,导致回滚失败。

    阿里开发规范:

    TRUNCATE TABLEDELETE 速度快,且使用的系统和事务日志资源少,从而无法通过日志回滚,但TRUNCATE无事务且不触发TRIGGER 有可能造成事故,故此不建议在开发代码中使用此语句。说明: TRUNCATE TABLE在功能上与不带 WHERE 子句的DELETE语句是相同的

    Mysql 8.0 新特性:原子化

    Mysql 8.0 版本中,lnnoDB表的DDL 支持事务完整性,即DDL 操作要么成功要么回滚。DDL操作回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log(该表是隐藏的表,通过 show tables 是无法看到的)中,用于回滚操作。通过设置参数,可将 DDL操作日志打印输出到 Mysql错误日志中。

    原子化: 整个事务时不可分割的最小单位,事务中任何一个语句执行失败,所有已经执行成功的语句要回滚,整个数据库状态要恢复到执行事务前的状态。举个例子:搭积木,一个巴黎铁塔,当你前面的所有都搭建好后,只差最后一个塔头,没有搭建好,你正要完成它时,失败了,巴黎铁塔,塌了,因为最后的一个失败,你需要恢复到原点重新搭建,巴黎铁塔。这就是原子化,当执行事务中,一个环节执行失败了,前面已经执行成功的不算,回到最初。这个是 Mysql 8.0 的新特性。

    演示如下:

    我们删除两个表,一个myemp2表是存在的,一个myemp5表是不存在的

    SHOW TABLES
    FROM test01;
    
    • 1
    • 2

    在这里插入图片描述


    使用 DROP TABLE 逗号分隔开,删除多个表

    DROP TABLE myemp2,myemp5;
    
    • 1

    在这里插入图片描述


    从结果上看,删除失败了,我们再看看,表myemp2 是否被删除,Mysql 8.0 的原子性,该表是没有被删除的,如下:

    SHOW TABLES
    FROM test01;
    
    • 1
    • 2

    在这里插入图片描述


    最后:

    限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!

    在这里插入图片描述

  • 相关阅读:
    【go语言】结构体
    HarmonyOS 数据管理与应用数据持久化(二)
    初识Python——Python环境安装配置
    Flutter循序渐进==>封装、继承、多态、抽象类以及属性修改
    CAD二次开发--点击窗体按钮后还要再次点击CAD获取焦点才能进行操作?【winform/wpf与CAD焦点切换滞后问题解决办法】
    数据结构(持续更新)
    用C语言实现状态机设计模式
    Python标准库分享之时间与日期 (time, datetime包)
    外部访问win服务器的mysql数据库
    Nginx代理中使用斜杠的区别
  • 原文地址:https://blog.csdn.net/weixin_61635597/article/details/126486013