背景
在一个维度比较广的存储过程中实现一个事务处理,并发时仅允许一个调用。
需求
由于特殊业务,在物化视图,没办法满足的情况下,实现一个缓存表,这个表数据来源广,需要实现动态更新缓存数据表。
实现
通过查询pg_stat_activity的状态来判断,存储过程是否正在运行。
|  1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
 | CREATE OR REPLACE PROCEDURE public.cache_for_7_day()
 LANGUAGE plpgsql
AS $procedure$
DECLARE
    query_text text := 'call cache_for_7_day()%'; -- 要检查的查询
    query_running boolean;
    BEGIN
        SELECT case when count(state) >= 2 then true else false end
        FROM pg_stat_activity
        WHERE query ilike query_text
          	AND state = 'active' INTO query_running;
        -- 如果查询正在执行,则退出
    	IF query_running THEN
        	--RAISE NOTICE 'Query is already running. Exiting the procedure. %', query_running ;
        	RETURN;
    	END IF;
        -- INSERT INTO
    END;
$procedure$;
 | 
测试
启动两个终端执行。
| 1
 | psql#> call cache_for_7_day();
 |