代码之家  ›  专栏  ›  技术社区  ›  babbageclunk

事务内部PostgreSQL架构更改的限制?

  •  11
  • babbageclunk  · 技术社区  · 15 年前

    我的数据库背景是Oracle,因此我惊讶地发现Postgres在事务中包含模式更改——如果开始更改,创建一个表,然后回滚,表就会消失。它还可以用于添加和删除列。显然这很好。

    有人能给我一些关于Postgres中事务性模式更改的文档或讨论的建议吗?(我们正在使用8.2.13,尽管我们将在不久的将来进行升级。)或者只是一些关于不包含在事务中的语句的细节?

    5 回复  |  直到 15 年前
        1
  •  13
  •   user80168 user80168    15 年前

    根据文档上的quick grep,这些命令不能在事务中执行:

    • 准备好提交
    • 创建数据库
    • 创建表空间
    • 丢弃
    • 删除数据库
    • 删除表空间
    • 准备回滚
    • 真空
        2
  •  9
  •   Stephen Denne    15 年前
    • nextval setval 序列上的操作永远不会回滚。
    • REINDEX DATABASE
    • REINDEX SYSTEM

    有一个 article about transactional DDL on the PostgreSQL Wiki

        3
  •  4
  •   user724498 user724498    12 年前

    从PosgreSQL的9.1版开始,schema create语句似乎确实是事务性的。

    select * from pg_namespace where nspname = 'foo';
     nspname | nspowner | nspacl 
    ---------+----------+--------
    (0 rows)
    
    begin;
    create schema foo;
    rollback;
    
    select * from pg_namespace where nspname = 'foo';
     nspname | nspowner | nspacl 
    ---------+----------+--------
    (0 rows)
    
    begin;
    create schema foo;
    commit;
    
    select * from pg_namespace where nspname = 'foo';
     nspname | nspowner | nspacl 
    ---------+----------+--------
     foo     |       10 | NULL
    (1 row)
    
        4
  •  2
  •   bsb    11 年前

    同时运行“createtable”的两个会话有点轻快:

    http://postgresql.1045698.n5.nabble.com/Errors-on-CREATE-TABLE-IF-NOT-EXISTS-td5659080.html

    CREATETABLE进行初步检查,以查看名称是否冲突 存在。如果是这样的话,它要么出错(正常),要么带着通知退出 (在不存在的情况下)。但是有一个比赛条件:a 在我们自己创造它之前。

    链接线程启动器和我在自动化测试环境中都遇到了这个问题,

    perl -MDBI -E 'fork; fork; $d=DBI->connect("dbi:Pg:dbname=$ENV{USER}");' \
     $d->do("CREATE TABLE a (b int)")'
    DBD::Pg::db do failed: ERROR:
       duplicate key value violates unique constraint "pg_type_typname_nsp_index"
    DETAIL:  Key (typname, typnamespace)=(a, 2200) already exists. at -e line 1.
    
        5
  •  0
  •   Martin    6 年前

    section 13.5

    某些DDL命令,目前仅截断和重写表 ALTER TABLE的表单不是MVCC安全的。这意味着 截断或重写提交时,表将显示为空 DDL命令已提交。这只是交易的一个问题 在DDL命令之前没有访问相关的表 开始[]

    ALTER TABLE 第节提到

    添加带有默认子句的列或更改 重写。更改现有文件的类型时作为例外 列,如果USING子句不更改列内容和 旧类型是可强制为新类型的二进制类型或 或者删除系统oid列也需要重写整个 桌子