【问题标题】:Run two separate transactions in one PostgreSQL function在一个 PostgreSQL 函数中运行两个单独的事务
【发布时间】:2018-06-19 12:13:01
【问题描述】:

我有一个 PostgreSQL 函数,大约需要 30 分钟才能完成。运行该函数时,我想在函数开始处向名为 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

【问题讨论】:

  • 看看 SO - 已回答。例如可以使用 dblink hack
  • dblink hack 是什么意思?
  • 您可以使用 dblink 打开另一个到同一个数据库的连接并在那里执行INSERT。然后可以单独提交。但也许你可以找到一种方法将函数分成两部分并在两者之间提交,这可能更清洁且成本更低。

标签: postgresql plpgsql


【解决方案1】:

正如 Laurenz 在 cmets 中指出的那样,

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

但也许你可以找到一种方法将函数分成两部分并在两者之间提交,这可能更清洁、更便宜

【讨论】:

  • 最后我已经拆分了函数,并在应用程序级别分别调用了这两个函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多