DCL 中 COMMIT 和 ROLLBACK

COMMIT:提交数据。一旦执行COMMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
ROLLBACK:回滚数据。一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT之后。

对比 TRUNCATE TABLE 和 DELETE FROM

相同点:都可以实现对表中所有数据的删除,同时保留表结构。
不同点:
1,TRUNCATE TABLE:一旦执行此操作,表数据全部清除。
同时,数据是不可以回滚的。
2,DELETE FROM:一旦执行此操作,表数据可以全部清除(不带WHERE)。
同时,数据是可以实现回滚的。

DDL 和 DML 的说明

1,DDL的操作一旦执行,就不可回滚。指令SET autocommit = FALSE对DDL
操作失效。(因为在执行完DDL操作之后,一定会执行一次COMMIT。
而此COMMIT操作不受SET autocommit = FALSE影响的。)
2,DML的操作默认情况,一旦执行,也是不可回滚的。
但是,如果在执行DML之前,执行了SET autocommit = FALSE,
则执行的DML操作就可以实现回滚。

演示:DELETE FROM

  1. #1)
  2. COMMIT; #提交
  3. #2)
  4. SELECT *
  5. FROM myemp3; #查询
  6. #3)
  7. SET autocommit = FALSE; # 执行
  8. #4)
  9. DELETE FROM myemp3; # 删除
  10. #5)
  11. SELECT *
  12. FROM myemp3; # 查询,此时没有表
  13. #6)
  14. ROLLBACK; # 回滚最近操作
  15. #7)
  16. SELECT *
  17. FROM myemp3; # 此时表中数据出现

成功

演示:TRUNCATE TABLE

#1)
COMMIT; # 提交
#2)
SELECT *
FROM myemp3; # 查询
#3) 
SET autocommit = FALSE; #执行
#4)
TRUNCATE TABLE myemp3; # 删除
#5)
SELECT *
FROM myemp3; # 查询
#6)
ROLLBACK; #回滚
#7)
SELECT *
FROM myemp3; # 此时失败

失败!

结论:DDL是不支持回滚的,因为DDL操作时已经开始commit了,并且不支持参数影响,但DML受影响。

测试MySQL8.0的新特性:DDL的原子化

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

以下的语句在MySQL5.7中是成功的, 但是在MySQL8.0中是失败的。

CREATE DATABASE mytest;

USE mytest;

CREATE TABLE book1(
book_id INT ,rr
book_name VARCHAR(255)
);

SHOW TABLES;

DROP TABLE book1,book2;

SHOW TABLES;