Tru*_*gNT 2 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
...
Run Code Online (Sandbox Code Playgroud)
如何强制功能A顺序运行?
表示强制:查询1运行->完成或超时->查询2运行->完成或超时->查询运行->完成或超时...(不允许查询1和查询2同时运行)
使用咨询锁。
函数主体中的第一个命令应为(1234是示例整数常量):
perform pg_advisory_xact_lock(1234);
Run Code Online (Sandbox Code Playgroud)
当两个并发会话调用该函数时,其中一个将等待,直到第二个会话中的函数完成。这是事务级别的咨询锁,在事务终止时自动释放。
或者,您可以使用会话级咨询锁,可以(应该)手动释放该锁:
create function example()
returns void language plpgsql as $$
begin
perform pg_advisory_lock(1234);
--
-- function's commands
--
perform pg_advisory_unlock(1234);
end $$;
Run Code Online (Sandbox Code Playgroud)
在会话中获得的所有咨询锁都会在会话结束时自动释放(如果尚未提前释放)。