事务内 PostgreSQL 模式更改的限制?
我的数据库背景是 Oracle,所以我惊讶地发现 Postgres 在事务中包含架构更改 - 如果您开始一个表,创建一个表,然后回滚,该表就会消失。 它也适用于添加和删除列。 显然这非常好。
我们即将对依赖此功能的架构增量的部署方式进行一些更改。 在我们这样做之前,我想了解交易保证的期限有多长,但我在文档中找不到任何相关信息。 我假设我只是使用了错误的搜索词 - 我的搜索只是进入包含“交易”、“创建”和“表”等词的大命令列表。
谁能给我一些关于 Postgres 中事务模式更改的文档或讨论? (我们正在使用 8.2.13,尽管我们将在不久的将来进行升级。)或者只是有关不会包含在交易中的语句的一些详细信息?
My database background is with Oracle, so I was surprised to discover that Postgres includes schema changes in transactions - if you begin one, create a table and then rollback, the table goes away. It works for adding and removing columns as well. Obviously this is very nice.
We're about to make some changes to the way we deploy schema deltas that rely on this feature. Before we do, I'd like to find out how far the transactional guarantee extends, but I can't find any information on it in the documentation. I assume I'm just using the wrong search terms - my searches just go to big lists of commands which include the words 'transaction', 'create' and 'table'.
Can anyone give me some pointers to docs or discussions about transactional schema changes in Postgres? (We're using 8.2.13, although we'll be upgrading in the not too distant future.) Or just some details about statement that won't be included in the transaction?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
从手册中,第 13.5 节(货币控制:警告) :
关于表重写 ALTER TABLE 部分提到
From the manual, section 13.5 (Currency Control: Caveats):
Regarding table rewriting the ALTER TABLE section mentions
根据文档上的快速grep,这些命令不能在事务中执行:
According to quick grep on docs, these commands cannot be executed in transactions:
nextval
和setval
操作永远不会回滚。REINDEX DATABASE
REINDEX SYSTEM
有一篇关于事务性的文章PostgreSQL Wiki 上的 DDL
nextval
andsetval
operations on sequences are never rolled back.REINDEX DATABASE
REINDEX SYSTEM
There's an article about transactional DDL on the PostgreSQL Wiki
从 PosgreSQL 9.1 版本开始,模式创建语句似乎确实是事务性的。
As of version 9.1 of PosgreSQL, it appears that schema create statements are indeed transactional.
两个会话同时运行“CREATE TABLE”有点活泼:
http://postgresql.1045698.n5.nabble.com/Errors-on-CREATE-TABLE-IF-NOT-EXISTS-td5659080.html
链接的线程启动器和我在自动化测试环境中都遇到了这个问题,
所以这只不过是一个烦恼而已。 (我怀疑这会影响你的模式迁移,但它可以被视为对 ddl 更改的限制)
Two sessions concurrently running "CREATE TABLE" is a little racy:
http://postgresql.1045698.n5.nabble.com/Errors-on-CREATE-TABLE-IF-NOT-EXISTS-td5659080.html
Both the linked thread initiator and I hit this in automated testing environments,
so it's not much more than an annoyance there. (I doubt it would effect your schema migrations, but it can be seen as a limit on ddl changes)