运行 一个 PostgreSQL 函数中的两个独立事务

Run two separate transactions in one PostgreSQL function

我有一个 PostgreSQL 函数,大约需要 30 分钟才能完成。当 运行 该函数时,我想在函数开头插入一行到单独的 table 调用 running_status 并在完成函数后更新该记录。

CREATE OR REPLACE FUNCTION fun1(arg1 numeric, arg2 numeric)
  RETURNS numeric
LANGUAGE plpgsql
AS $$
DECLARE
    -- <declare variabls>
BEGIN
    BEGIN
        -- <insert status record>
    END;

    -- <function body>

    BEGIN
        -- <update status record>
    END;
END;
$$;

但问题是,由于该函数是在事务块(BEGIN、END 块)中定义的,因此它将作为事务执行。因此,在整个块完成之前,此状态记录不会插入到数据库中。

所以我的问题是如何在启动函数体之前将这条记录插入数据库?

Start Function -> insert record to db -> commit -> run function body -> commit -> End function

正如 Laurenz 在评论中指出的那样,

您可以使用 dblink 打开与同一数据库的另一个连接并在那里执行 INSERT。然后它可以单独提交。

但也许你可以找到一种方法将函数分成两部分并在两者之间提交,这可能更干净、成本更低