Mysql: COMMIT 和 ROLLBACK
每博一文案
天空黑暗到一定程度,星辰就会熠熠生辉,但凡熬过了的,
都是百毒不侵,我们今天受的苦,吃的亏,担的责,忍的痛
到最后都会变成光照亮下半场的路。
当我们熬过所有的苦,就会发现,原来自己比想象中勇敢,原来生活真
的会苦尽甘来。
生活总是泥沙俱下,成为自己生命的摆渡人,一边咬牙挣扎,一边负重前行。
愿你在人生这场路上不畏艰险,像蝴蝶一样一再的蜕变一再的祝愿。
既不忧虑也不彷徨,既不回顾,也不忧伤,坦然而真诚地活着。
—————— 一禅心灵庙语
文章目录
COMMIT 和 ROLLBACK的介绍
COMMIT : 表示提交数据。一旦执行 COMMIT
,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
ROLLBACK :回滚数据。一旦执行 ROLLBACK
,则可以实现数据的回滚,回滚到最近的一次 COMMIT
之后。
TRUNCATE TABLE 和 DELETE FROM
对比 TRUNCATE TABLE
和 DELETE FROM
的不同与相同点
相同点: 都可以实现对表中的所有数据的删除,同时保留表结构
不同点:
-
DDL ——>
TRUNCATE TABLE
- 一旦执行此操作,表数据全部清除,无法回滚,会自动执行
COMMIT
提交数据的操作。 - 这种删除效率比较高,表被一次截断,物理硬盘上删除了。
- 这种删除的缺点就是:不支持回滚
- 这种删除的优点就是:快速
- 不支持单条记录的删除,只能整表删除,就是不可以使用
where
条件的筛选
- 一旦执行此操作,表数据全部清除,无法回滚,会自动执行
-
DML ——>
DELECT FROM
-
一旦执行此操作,表数据可以全部清除,不带
where
-
表中的数据被删除,但是这个数据在硬盘上的实质数据是没有被删除的,真实存储的空间不会被释放 !!! 可以通过 在删除前,设置
SET autocommit = FALSE
,实现回滚。 -
这种删除的缺点就是:删除效率比较低
-
这种删除的优点就是:通过设置可以实现回滚,后悔了,可以再恢复数据 !!!
-
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 = FALSE
对 DDL
操作失效。该操作之后,一定会执行一次commit
提交数据。而导致,commit
操作不受 SET autocommit = FALSE
的影响了,导致回滚
失败。
阿里开发规范:
TRUNCATE TABLE
比 DELETE
速度快,且使用的系统和事务日志资源少,从而无法通过日志回滚,但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;
最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!