如何强制PostgreSQL函数顺序运行

时间:2017-11-05 17:49:35

标签: postgresql parallel-processing

我有一个PostgreSQL函数A. 许多客户会致电A:

- client X1 send query 1 "SELECT A();" then
- client X2 send  query 2 "SELECT A();" then
- client X3 send query 3  "SELECT A();" then
...

如何强制功能A按顺序运行?

表示强制:查询1运行 - >完成或超时 - >查询2运行 - >完成或超时 - >查询运行 - >完成或超时...(不允许查询1和查询2同时运行)

2 个答案:

答案 0 :(得分:5)

使用advisory locks.

函数体中的第一个命令应该是(1234是一个示例性整数常量):

perform pg_advisory_xact_lock(1234);

当两个并发会话调用该函数时,其中一个将等待,直到第二个函数完成。这是一个事务级别的建议锁定,在事务终止时自动释放。

或者,您可以使用会话级别的建议锁定,可以(应该)手动释放:

create function example()
returns void language plpgsql as $$
begin
    perform pg_advisory_lock(1234);
    --
    -- function's commands
    --
    perform pg_advisory_unlock(1234);
end $$;

会话中获得的任何建议锁定都会在会话结束时自动释放(如果之前尚未发布)。

答案 1 :(得分:0)

我认为完整的答案是在函数A中使用pg_advisory_xact_lock + idle_in_transaction_session_timeout

查询2将等到查询1完成(锁定自动释放)或超时(会话自动终止并且锁定也自动释放)。