什么是原子DDL
MySQL 8.0 开始支持原子性的数据定义语言(DDL),也称为原子 DDL。一个原子 DDL 语句将相 关的数据字典更新、存储引擎操作以及写入二进制日志组合成单一的原子事务。
当事务正在处理时出现服务器故障,该事务可能被提交,相应的变更会保存到数据字典更新、存储引擎更改以及二进 制日志中;也可能被整体回滚。目前,只有 InnoDB 存储引擎支持原子 DDL。
支持原子DDL
- 数据库、表空间、表、索引的 CREATE、ALTER 以及 DROP 语句,以及 TRUNCATE TABLE 语句
- 存储过程、触发器、视图以及用户定义函数(UDF)的 CREATE 和 DROP 语句,以及适用的 ALTER 语句
- 用户和角色的 CREATE、ALTER、DROP 语句,以及 GRANT 和 REVOKE 语句
不支持原子DDL
- 非 InnoDB 存储引擎上的表相关 DDL 语句
- INSTALL PLUGIN 和 UNINSTALL PLUGIN 语句
- INSTALL COMPONENT 和 UNINSTALL COMPONENT 语句
- CREATE SERVER、ALTER SERVER 以及 DROP SERVER 语句
原子DDL的使用
任何 DDL 语句,包括原子性或其他的 DDL,都会隐式地结束当前事务,就像在执行语句之前执行了COMMIT 操作一样。这就意味着 DDL 语句不能位于其他事务之中,不能位于事务控制语句(如 START TRANSACTION … COMMIT)之中,也不能与同一个事务中的其他语句组合使用。
实战案例
> create table test1(id int);
Query OK, 0 rows affected (0.05 sec)
mysql> drop table test1, test2;
ERROR 1051 (42S02): Unknown table 'testdb.test2'
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| employee |
| employee_view |
| test1 |
| word_test |
+------------------+
4 rows in set (0.01 sec)
mysql>