我的后台数据库与Oracle,所以我很惊讶地发现,Postgres的包括交易模式的变化 - 如果你开始一个,创建一个表,然后回滚,该表消失。 它适用于添加和删除列,以及。 显然,这是非常好的。
我们即将作出一些改变,我们部署,依赖于这个要素模式增量的方式。 我们这样做之前,我想找出多远事务担保延伸,但我不能找到文档中的任何信息。 我以为我只是用错了搜索词 - 我的搜索只是去命令的大名单,其中包括单词“交易”,“创造”和“表”。
谁能给我一些指点,以文档或讨论有关在Postgres的交易模式的变化? (我们使用的是8.2.13,但我们将在不远的将来可以升级。)或者只是一些有关声明的详细信息将不会被包含在交易?
-
nextval
和setval
对序列的操作也决不回滚。 -
REINDEX DATABASE
-
REINDEX SYSTEM
这里有一个关于交易DDL的PostgreSQL的维基文章
作为PosgreSQL的9.1版本,看来模式创建语句确实是事务性的。
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)
两会同时运行的“CREATE TABLE”是一个小情趣:
http://postgresql.1045698.n5.nabble.com/Errors-on-CREATE-TABLE-IF-NOT-EXISTS-td5659080.html
CREATE TABLE做了初步检查,以查看名称是否存在冲突。 如果是这样,它要么出现了错误(正常)或退出的通知书(在IF NOT EXISTS的情况下)。 但是有一个竞争条件:有冲突的事务可以创建表,我们作出这样的检查后,才创建它自己。
无论是联线和引发我在自动化测试环境中打这个,所以它并不比一个烦恼还有更多。 (我怀疑它会影响您的架构迁移,但它可以被看作是对DDL更改的限制)
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.
从手动, 部分13.5 (货币控制:注意事项):
有些DDL命令,目前仅TRUNCATE和ALTER TABLE的表改写形式,不MVCC安全。 这意味着,截断或重写提交后,该表将显示为空并发交易,如果他们使用犯下的DDL命令之前拍摄的快照。 这将只对未在DDL命令之前访问相关表中的交易问题开始[...]
关于表重写ALTER TABLE部分提到
添加列与DEFAULT子句或更改现有柱的类型将所需要的整个表[...]被重写。 作为改变现有列的类型时,如果USING子句不改变列内容和旧类型是二进制强制转换到新的类型或在所述新型的无约束域异常,不需要表重写[ ...]添加或删除系统oid字段也需要重写整个表。