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)
COMMIT; #提交
#2)
SELECT *
FROM myemp3; #查询
#3)
SET autocommit = FALSE; # 执行
#4)
DELETE FROM myemp3; # 删除
#5)
SELECT *
FROM myemp3; # 查询,此时没有表
#6)
ROLLBACK; # 回滚最近操作
#7)
SELECT *
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;