Appearance
COMMIT
提交数据,一旦执行 COMMIT,数据永久保存在数据库,不可以回滚。
ROLLBACK
回滚数据,一旦执行 ROLLBACK,可以实现数据的回滚,回滚到最近的一次 COMMIT 之后。
TRUNCATE TABLE & DELECT FROM
相同:
都可以实现对表中所有数据的删除,同时保留表结构。
不同:
一旦执行 TRUNCATE,表数据全部删除,不可以回滚。(执行完 DDL 之后,一定会自动执行一次 COMMIT,此 COMMIT 操作不受 SET autocommit = FALSE 影响,之后执行 ROLLBACK 就回滚到自动执行的那次 COMMIT 之后了。) 一旦执行 DELECT,表数据可以全部删除(如果不带 WHERE),可以回滚(取决于之前是否执 行 SET autocommit = FALSE)。
DDL & DML
DDL 的操作一旦执行就不可回滚。 DML 的操作默认情况下,一旦执行不可回滚。但是如果执行之前,执行了 SET autocommit = FALSE,则执行的 DML 操作可以回滚。
演示
sql
COMMIT;
SELECT * FROM foo;
SET autocommit = FALSE;
DELETE FROM foo;
# 此时没有数据
SELECT * FROM foo;
# 回滚到最后一次 COMMIT 之后
ROLLBACK;
# 成功回滚数据
SELECT * FROM foo;sql
COMMIT;
SELECT * FROM foo;
SET autocommit = FALSE;
TRUNCATE TABLE foo;
# 此时没有数据
SELECT * FROM foo;
# 尝试回滚到最后一次 COMMIT 之后
ROLLBACK;
# 回滚失败,仍然没有数据。
SELECT * FROM foo;MySQL8.0 新特性:DDL 原子性
sql
# MySQL5.7 中,table2 不存在,虽然报错,但 table1 仍然被删除。
# MySQL8.0 中,table2 不存在,虽然报错,但 table1 没有被删除。=> 原子性
DROP TABLE table1, talbe2