我有一个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同时运行)
答案 0 :(得分:5)
函数体中的第一个命令应该是(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完成(锁定自动释放)或超时(会话自动终止并且锁定也自动释放)。