运行 一个 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
。然后它可以单独提交。
但也许你可以找到一种方法将函数分成两部分并在两者之间提交,这可能更干净、成本更低
我有一个 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
。然后它可以单独提交。
但也许你可以找到一种方法将函数分成两部分并在两者之间提交,这可能更干净、成本更低