postgresql - 在事务中创建数据库

标签 postgresql

根据 postgresql 文档;

CREATE DATABASE cannot be executed inside a transaction block.

这有技术原因吗?

最佳答案

当你尝试它时,你会得到错误:

ERROR:  CREATE DATABASE cannot run inside a transaction block

这来自 src/backend/access/transam/xact.c(我的源代码中的第 3023 行,但因版本而异),在 PreventTransactionChain(...)

那里的评论解释说:

This routine is to be called by statements that must not run inside a transaction block, typically because they have non-rollback-able side effects or do internal commits.

对于 CREATE DATABASE,在 T_CreatedbStmt< 的情况下,它是从 standard_ProcessUtility 中的 src/backend/tcop/utility.c 调用的,但不幸的是,没有任何信息性评论说明为什么 CREATE DATABASE 在事务中运行不安全。

查看源代码,我可以看到一方面它强制检查点。

不过,总的来说,我没有看到任何真正大声疾呼“我们不能以事务方式执行此操作”的内容。更多的是“我们还没有实现以事务方式执行此操作的功能”。

关于postgresql - 在事务中创建数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22934602/

相关文章:

postgresql - Heroku PGBackups - 运行 "heroku pg:backups"时看不到每日备份

使用 COPY 导入数据后,PostgreSQL 全文搜索不使用索引

sql - 如何在 PostgreSQL 中编写 upsert 触发器?

postgresql - 将 9.3 迁移到 9.4 postgres 时选择哪一个(pg_basebackup 或 pg_dumpall)

postgresql - Postgres : Using function variable names in pgsql function

database - AWS RDS - 降级数据库实例类会导致现有数据丢失吗?

node.js - 跨关系的可选查询

json - 合并两个联接表并输出为 JSON?

sql - 在 PostgreSQL 中按字母顺序对字符串中的字母进行排序

postgresql - 没有新列的表继承