18

我知道在 MySQL ddl 语句中,例如 alter table/create table/etc 会导致隐式事务提交。

当我们迁移到 PostgreSQL 时,是否可以在一个事务中包装多个 DDL 语句?

这将使迁移脚本更加健壮,失败的 DDL 更改将导致一切回滚。

4

2 回答 2

22

DDL 语句由事务覆盖。我在官方文档中找不到相关部分,但提供了一个指向涵盖它的 wiki 的链接。

请记住,事务不会在 postgresql 中自动打开,您必须使用BEGINor启动它们START TRANSACTION

Postgresql Wiki 关于事务性 DDL

于 2012-11-19T21:33:28.160 回答
20

并非每个 Postgres DDL 语句都可以包装在事务中。DROP DATABASE像/和其他一些与文件系统相关的语句DROP TABLESPACE不能回滚。

还:

ALTER TYPE ... ADD VALUE(向枚举类型添加新值的形式)不能在事务块内执行。

还有一些语句,如TRUNCATE“不是 MVCC 保存”。此类语句所做的更改可能会影响其他查询,即使它们已回滚。

所以 - 阅读你的 postgres 版本的官方手册,看看你的 DDL 是否是事务安全的。

于 2012-11-19T21:54:00.913 回答