Mysql: COMMIT 和 ROLLBACK

Mysql: COMMIT 和 ROLLBACK

在这里插入图片描述

每博一文案

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


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;  /* 提交数据 */
-- 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.
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 回滚回来了 */

TRUNCATE TABLE 回滚演示

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

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

在这里插入图片描述


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

在这里插入图片描述


为什么会回滚失败

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;

在这里插入图片描述


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

DROP TABLE myemp2,myemp5;

在这里插入图片描述


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

SHOW TABLES
FROM test01;

在这里插入图片描述


最后:

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

在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值