我在stored procedure下面顯示了一個從 postgres 觸發的每15 分鐘cron運行一次。通常,此程序需要更多時間才能完成。在這種情況下,當實作下一個計劃并再次呼叫程式時,我希望仍然呼叫程式,但等到前一個程式完成。如何在不丟失任何新程序呼叫的情況下實作這一目標?我聽說這可以通過使用來實作,advisory lock但我不確定我應該如何準備我的程式來實作這樣的功能。誰能告訴我我該如何準備我的程式?
我的存盤程序:
CREATE OR REPLACE PROCEDURE public.test_procedure(p1 integer,
INOUT p2 character varying)
LANGUAGE plpgsql
AS $procedure$
DECLARE
loop_var int;
BEGIN
IF p1 is null OR p2 is null THEN
RAISE EXCEPTION 'input cannot be null';
END IF;
DROP TABLE if exists test_table;
CREATE TEMP TABLE test_table(a int, b varchar);
FOR loop_var IN 1..p1 LOOP
insert into test_table values (loop_var, p2);
p2 := p2 || ' ' || p2;
END LOOP;
END;
$procedure$
修改后的程式:
CREATE OR REPLACE PROCEDURE public.test_procedure(p1 integer,
INOUT p2 character varying)
LANGUAGE plpgsql
AS $procedure$
DECLARE
loop_var int;
BEGIN
SELECT pg_advisory_lock(4711);
IF p1 is null OR p2 is null THEN
RAISE EXCEPTION 'input cannot be null';
END IF;
DROP TABLE if exists test_table;
CREATE TEMP TABLE test_table(a int, b varchar);
FOR loop_var IN 1..p1 LOOP
insert into test_table values (loop_var, p2);
p2 := p2 || ' ' || p2;
END LOOP;
SELECT pg_advisory_unlock(4711);
END;
$procedure$
uj5u.com熱心網友回復:
根據檔案:
在程式開始時,獲取一個獨占咨詢鎖:
SELECT pg_advisory_lock(4711);
在即將結束之前,釋放鎖:
SELECT pg_advisory_unlock(4711);
數字 4711 是一個亂數,重要的是您不會在其他任何地方使用相同的咨詢鎖號。
然后,該函式的第二次并發執行將在它嘗試獲取咨詢鎖時阻塞,并且只有在鎖被釋放時才允許繼續執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484632.html
標籤:PostgreSQL
上一篇:SQL:隱藏計算列
