WITH 语句中的查询是否在 PostgreSQL 的单个事务中执行?

Evg*_*kii 1 postgresql transactions with-statement

我在 WITH 语句中做了很多查询。他们应该在一笔交易中。我应该在交易中明确涵盖我的大查询还是没有必要?

这是我的查询的粗略示例:

WITH
    remains_actual AS (
        SELECT
            ...
    )
    affected_remains AS (
        INSERT INTO
            ...
        ON CONFLICT (...) DO UPDATE SET
            ...
        RETURNING
            ...
    )
    affected_products AS (
        SELECT DISTINCT
            ...
    )
INSERT INTO
    ....
Run Code Online (Sandbox Code Playgroud)

Nic*_*nes 5

文档

PostgreSQL 实际上将每个 SQL 语句视为在事务中执行。如果您不发出 BEGIN 命令,则每个单独的语句都有一个隐式 BEGIN 和(如果成功)围绕它的 COMMIT。

一条WITH语句仍然算作单个语句,因此它将在隐式事务块中运行。

您可以使用一些返回当前事务 ID 的 CTE 自己测试:

with
  tx1 as (select txid_current()),
  tx2 as (select txid_current())
select * from tx1, tx2;

 txid_current | txid_current
--------------+--------------
        12814 |        12814
(1 row)
Run Code Online (Sandbox Code Playgroud)