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