Ao tentar, você recebe o erro:
ERROR: CREATE DATABASE cannot run inside a transaction block
Isso vem de
src/backend/access/transam/xact.c
(linha 3023 em minhas fontes, mas varia de acordo com a versão), em PreventTransactionChain(...)
. O comentário lá explica que:
Para
CREATE DATABASE
é chamado de src/backend/tcop/utility.c
em standard_ProcessUtility
no caso de T_CreatedbStmt
, mas infelizmente não há nenhum comentário informativo que diga por que especificamente CREATE DATABASE
não é seguro para executar em uma transação. Olhando para as fontes, posso ver que, por um lado, força um ponto de verificação.
No geral, porém, não vejo nada que realmente grite "não podemos fazer isso transacionalmente". É mais "não implementamos a funcionalidade para fazer isso transacionalmente".