根据postgresql文档;
CREATE DATABASE cannot be executed inside a transaction block.
这有技术原因吗?
答案 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)
它的概念原因:文件创建与数据库事务无关,并且没有保证在回滚期间它们将被删除。