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

3

我在WITH语句中做了很多查询,它们应该在一个事务中。我是否需要显式地将我的大查询包含在事务中,还是不必要?

以下是我查询的一个简单示例:

Original Answer翻译成"最初的回答"

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

查看类似问题的答案:获取函数复制的数据 - Adam
每个在Postgres中的语句都是原子性地执行的。 - user330315
1个回答

9

根据文档:

实际上,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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接