我知道在 MySQL ddl 语句中,例如 alter table/create table/etc 会导致隐式事务提交。
当我们迁移到 PostgreSQL 时,是否可以在一个事务中包装多个 DDL 语句?
这将使迁移脚本更加健壮,失败的 DDL 更改将导致一切回滚。
我知道在 MySQL ddl 语句中,例如 alter table/create table/etc 会导致隐式事务提交。
当我们迁移到 PostgreSQL 时,是否可以在一个事务中包装多个 DDL 语句?
这将使迁移脚本更加健壮,失败的 DDL 更改将导致一切回滚。
DDL 语句由事务覆盖。我在官方文档中找不到相关部分,但提供了一个指向涵盖它的 wiki 的链接。
请记住,事务不会在 postgresql 中自动打开,您必须使用BEGIN
or启动它们START TRANSACTION
。
并非每个 Postgres DDL 语句都可以包装在事务中。DROP DATABASE
像/和其他一些与文件系统相关的语句DROP TABLESPACE
不能回滚。
还:
ALTER TYPE ... ADD VALUE(向枚举类型添加新值的形式)不能在事务块内执行。
还有一些语句,如TRUNCATE
“不是 MVCC 保存”。此类语句所做的更改可能会影响其他查询,即使它们已回滚。
所以 - 阅读你的 postgres 版本的官方手册,看看你的 DDL 是否是事务安全的。