【发布时间】:2012-11-07 21:17:10
【问题描述】:
我知道在 MySQL ddl 语句中,例如 alter table/create table/etc 会导致隐式事务提交。
当我们迁移到 PostgreSQL 时,是否可以在一个事务中包装多个 DDL 语句?
这将使迁移脚本更加健壮,失败的 DDL 更改将导致一切回滚。
【问题讨论】:
标签: sql postgresql transactions ddl
我知道在 MySQL ddl 语句中,例如 alter table/create table/etc 会导致隐式事务提交。
当我们迁移到 PostgreSQL 时,是否可以在一个事务中包装多个 DDL 语句?
这将使迁移脚本更加健壮,失败的 DDL 更改将导致一切回滚。
【问题讨论】:
标签: sql postgresql transactions ddl
DDL 语句被事务覆盖。我在官方文档中找不到相关部分,但提供了一个指向涵盖它的 wiki 的链接。
请记住,事务不会在 postgresql 中自动打开,您必须以 BEGIN 或 START TRANSACTION 开头。
【讨论】:
create database)
并非每个 Postgres DDL 语句都可以包装在事务中。 DROP DATABASE / DROP TABLESPACE 之类的语句以及其他一些与文件系统相关的无法回滚。
还有:
ALTER TYPE ... ADD VALUE(向枚举添加新值的形式 type) 不能在事务块内执行。
还有一些像TRUNCATE 这样的语句“不是 MVCC 保存”。此类语句所做的更改可能会影响其他查询,即使它们已回滚。
所以 - 阅读您的 postgres 版本的官方手册,了解您的 DDL 是否是事务安全的。
【讨论】:
TRUNCATE 问题在 9.2 中仍然存在,至少根据文档。 postgresql.org/docs/current/static/sql-truncate.html 。不过,除了 DB 创建/删除和 TRUNCATE 之外,几乎所有东西都是事务安全的。
DROP TABLESPACE 呢?根据这个stackoverflow.com/questions/1108749/…,它不安全(或者不安全)。