是否可以在PostgreSQL中的事务中包装DDL更改?

时间:2012-11-19 21:22:13

标签: sql postgresql transactions ddl

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

当我们转向PostgreSQL时,是否可以在事务中包装多个DDL语句?

这会使迁移脚本更加健壮,DDL更改失败会导致所有内容回滚。

2 个答案:

答案 0 :(得分:19)

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

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

Postgresql Wiki about Transactional DDL

答案 1 :(得分:15)

并非每个Postgres DDL语句都可以包含在事务中。像DROP DATABASE / DROP TABLESPACE这样的语句以及其他一些与文件系统相关的无法回滚。

此外:

  

ALTER TYPE ... ADD VALUE(为枚举添加新值的表单)   type)不能在事务块内执行。

TRUNCATE这样的一些陈述“不是MVCC保存”。由这种语句进行的更改可能会影响其他查询,即使它们已回滚。

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