Из документов :
PostgreSQL фактически обрабатывает каждый оператор SQL как выполняемый в транзакции. Если вы не выполните команду BEGIN, то каждый отдельный оператор имеет неявный BEGIN и (в случае успеха) обернутый вокруг него COMMIT.
Оператор WITH
по-прежнему считается одним оператором, поэтому он будет выполняться в неявном блоке транзакции.
Вы можете проверить это самостоятельно с некоторыми CTE, которые возвращают текущий идентификатор транзакции:
with
tx1 as (select txid_current()),
tx2 as (select txid_current())
select * from tx1, tx2;
txid_current | txid_current
--------------+--------------
12814 | 12814
(1 row)