【问题标题】:Is it possible to wrap DDL changes in a transaction in PostgreSQL?是否可以在 PostgreSQL 的事务中包装 DDL 更改?
【发布时间】:2012-11-07 21:17:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql postgresql transactions ddl


    【解决方案1】:

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

    请记住,事务不会在 postgresql 中自动打开,您必须以 BEGINSTART TRANSACTION 开头。

    Postgresql Wiki about Transactional DDL

    【讨论】:

    • 我认为手册中没有关于事务性DDL的特殊章节。如果我没记错的话,您可以假设每个语句都是事务性的除非另有说明。所以手册只会记录那些非事务性的(例如create database
    • @a_horse_with_no_name 谢谢。您知道手册中的哪个位置,是否说 DDL 或删除数据库不能在事务中?另见stackoverflow.com/questions/51869619/…
    • @Tim:Notes section中的第一句话是:“CREATE DATABASE不能在事务块内执行
    【解决方案2】:

    并非每个 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/…,它不安全(或者不安全)。
    • 重要说明。截断是事务安全的,它不是 MVCC 安全的。
    • @Craig ALTER TYPE ... ADD VALUE 也不能在事务中执行
    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2020-07-30
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多