[PostgreSQL] Store procedure 是執行在 transaction 之中

[PostgreSQL] Store procedure 是執行在 transaction 之中

最近在研究專案中的一個 bug,

我們用一個 postgreSQL stored procedure 來清除資料表中的舊記錄,

可是卻意外發現從某一天開始,這個動作似乎就沒有成功過了…

 

下面是舉例的一個 stored procedure fn_purge():

CREATE OR REPLACE FUNCTION fn_purge(inymd text)
    RETURNS text AS
$BODY$

DECLARE timeYMD timestamp = cast(inYMD AS timestamp);

BEGIN

    DELETE FROM tb_history WHERE process_date < timeYMD;

    — Do something that would cause exceptions
    — ………

    RETURN ‘1’;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

 

後來發現我們在 fn_purge() 裡面,有作一些動作,可能會導致 exception…

可是為什麼 exception 會導致舊記錄完全沒有被清除呢?

理論上至少在 exception 發生之前,清除舊記錄的動作要是成功的才對…

 

研究了一下,原來 stored procedure 會被執行在一個 transaction 之中,

所以如果有失敗的話,就會整個被 rollback 了~~

詳情可以參考 PostgreSQL: Structure of PL/pgSQL~~

(本頁面已被瀏覽過 508 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料