首页/数据/SQL 速查/隐式提交:DDL 与事务的边界
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

隐式提交:DDL 与事务的边界

MySQL 里 DDL 语句会隐式提交当前事务;PostgreSQL 的 DDL 是事务性的、可以回滚,但持有更强的锁。

SQL 速查数据更新于 2026-10-12

MySQL 隐式提交示例

MySQL 隐式提交示例
START TRANSACTION;
INSERT INTO t (id) VALUES (1);
CREATE TABLE tmp_x (id INT);   -- 隐式提交:上面的 INSERT 也一起落库
ROLLBACK;                       -- 无法撤销 INSERT
-- 常见隐式提交语句:CREATE/ALTER/DROP/TRUNCATE/RENAME、CREATE INDEX、GRANT 等

PostgreSQL 事务性 DDL

PostgreSQL 事务性 DDL
BEGIN;
CREATE TABLE tmp_x (id int);
ALTER TABLE t ADD COLUMN note text;
ROLLBACK;   -- 建表与加列都被撤销
MySQLDDL 隐式提交;无法把 DDL 与 DML 放进同一回滚单元
PostgreSQLDDL 参与事务;但多数 ALTER 需要 ACCESS EXCLUSIVE 锁,执行期间阻塞读写
迁移注意依赖“失败回滚”的发布脚本在 MySQL 习惯下要重新设计

易错点

  • 在 MySQL 里把 DDL 与业务 DML 写在同一个事务里期望一起回滚:DDL 处已经隐式提交,前面语句无法撤销
  • PostgreSQL 的 DDL 可回滚只是语义,执行期间的排他锁会造成阻塞,发布窗口仍需评估

数据来源与参考

  • MySQL 8.0 Reference Manual · Statements That Cause an Implicit Commit
  • PostgreSQL Documentation · Transactional DDL
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌