來自MS SQL世界,我傾向於大量使用存儲過程。我目前正在編寫一個應用程序,它使用了很多PostgreSQL plpgsql函數。我想要做的就是回滾特定函數中包含的所有INSERT/UPDATES,如果我在其中的任何位置發生異常。PostgreSQL:回滾plpgsql函數中的事務?
我最初的印象是,每個函數都包含在自己的事務中,並且異常會自動回滾所有內容。但是,情況似乎並非如此。我想知道是否應該將保存點與異常處理結合使用呢?但我並不真正理解事務和保存點之間的區別,以瞭解這是否是最佳方法。有什麼建議嗎?
CREATE OR REPLACE FUNCTION do_something(
_an_input_var int
) RETURNS bool AS $$
DECLARE
_a_variable int;
BEGIN
INSERT INTO tableA (col1, col2, col3)
VALUES (0, 1, 2);
INSERT INTO tableB (col1, col2, col3)
VALUES (0, 1, 'whoops! not an integer');
-- The exception will cause the function to bomb, but the values
-- inserted into "tableA" are not rolled back.
RETURN True;
END; $$ LANGUAGE plpgsql;
你可以發佈一個函數的例子,不會像你期望的那樣回滾一切嗎?在調用語句的事務上下文中執行PL/pgSQL函數* do *,但BEGIN..EXCEPTION塊可以修改該行爲。沒有看到一個例子,很難給出適當的建議。 – 2010-03-11 18:19:40
編輯添加示例。謝謝。 – jamieb 2010-03-11 18:33:52
我正在運行8.4.2,創建tableA和B,每個都有三個int列,運行您的示例(在INSERT INTO tableB行結束時刪除「;」)並將其轟炸。我檢查了兩張桌子,他們都是空的。我甚至在兩者之間添加了一些調試代碼來驗證記錄在失敗之前是否存在,然後在失敗之後失效。 – 2010-03-11 19:00:03