在事务内创建DATABASE

时间:2014-04-08 10:43:35

标签: postgresql

根据postgresql文档;

CREATE DATABASE cannot be executed inside a transaction block.

这有技术原因吗?

2 个答案:

答案 0 :(得分:7)

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

ERROR:  CREATE DATABASE cannot run inside a transaction block

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

那里的评论解释说:

  

此例程将由不能在内部运行的语句调用    事务块,通常是因为它们具有不可回滚的功能    副作用或做内部提交。

CREATE DATABASE src/backend/tcop/utility.c来自standard_ProcessUtility的{​​{1}}来自T_CreatedbStmt,但很遗憾没有任何信息说明为什么具体CREATE DATABASE在交易中运行是不安全的。

看看这些消息来源,我可以看到它强迫一个检查点。

总的来说,我没有看到任何真正尖叫的东西,我们无法在交易中做到这一点"。它还有更多"我们还没有实现以交易方式执行此操作的功能"。

答案 1 :(得分:2)

它的概念原因:文件创建与数据库事务无关,并且没有保证在回滚期间它们将被删除。