【问题标题】:Are queries in the WITH statement executed in a single transaction in PostgreSQL?WITH 语句中的查询是否在 PostgreSQL 的单个事务中执行?
【发布时间】:2019-11-17 19:54:34
【问题描述】:

我在 WITH 语句中做了很多查询。他们应该在一个事务中。我应该明确地在事务中覆盖我的大查询还是没有必要?

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

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

【问题讨论】:

标签: postgresql transactions with-statement


【解决方案1】:

来自docs:

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)

【讨论】:

    猜你喜欢
    • 2016-09-10
    • 2013-01-23
    • 2021-05-03
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2017-01-11
    相关资源
    最近更新 更多