[PostgreSQL] Store procedure 是執行在 transaction 之中
最近在研究專案中的一個 bug,
我們用一個 postgreSQL stored procedure 來清除資料表中的舊記錄,
可是卻意外發現從某一天開始,這個動作似乎就沒有成功過了…
下面是舉例的一個 stored procedure fn_purge():
CREATE OR REPLACE FUNCTION fn_purge(inymd text)
RETURNS text AS
$BODY$
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~~
(本頁面已被瀏覽過 505 次)