Запросы в операторе WITH выполняются в одной транзакции в PostgreSQL? - PullRequest
1 голос
/ 08 июля 2019

Я делаю много запросов в операторе WITH.Они должны быть в одной транзакции.Должен ли я явно покрывать большой запрос в транзакции или он не нужен?

Это грубый пример моего запроса:

WITH
    remains_actual AS (
        SELECT
            ...
    )
    affected_remains AS (
        INSERT INTO
            ...
        ON CONFLICT (...) DO UPDATE SET
            ...
        RETURNING
            ...
    )
    affected_products AS (
        SELECT DISTINCT
            ...
    )
INSERT INTO
    ....

1 Ответ

2 голосов
/ 08 июля 2019

Из документов :

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)
...