Quando lo provi, ricevi l'errore:
ERROR: CREATE DATABASE cannot run inside a transaction block
Questo viene da src/backend/access/transam/xact.c
(riga 3023 sui miei sorgenti, ma varia in base alla versione), in PreventTransactionChain(...)
.
Il commento lì spiega che:
Per CREATE DATABASE
viene chiamato da src/backend/tcop/utility.c
in standard_ProcessUtility
nel caso di T_CreatedbStmt
, ma sfortunatamente non c'è alcun commento informativo che spieghi perché in particolare CREATE DATABASE
non è sicuro da eseguire in una transazione.
Guardando le fonti, posso vedere che per prima cosa forza un checkpoint.
Nel complesso, però, non vedo nulla che urli davvero "non possiamo farlo a livello transazionale". È più "non abbiamo implementato la funzionalità per farlo in modo transazionale".