背景

在一个维度比较广的存储过程中实现一个事务处理,并发时仅允许一个调用。

需求

由于特殊业务,在物化视图,没办法满足的情况下,实现一个缓存表,这个表数据来源广,需要实现动态更新缓存数据表。

实现

通过查询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();