2017-04-25 93 views
0

晚上好,使用交易的雙重插入postgres

我想創建一個具有適當隔離級別的TRANSACTION。在那個事務中,我想做一個雙重插入,如果一個失敗,另一個就會中止。

我有一個存儲過程已經創建:

create or replace function insert_into_answercomments(userid INTEGER, answerid INTEGER, body text) 
    returns void language plpgsql as $$ 
DECLARE result INTEGER; 
    insert into publications(body, userid) 
    VALUES (body, userid) 
    returning publications.publicationid AS publicationid INTO result; 

    insert into comments(publicationid) VALUES (result); 

    insert into answercomments(commentid, answerid) VALUES (result, answerid); 
end $$; 

我的疑問是,如果該交易應該是裏面的功能,或者如果它是一個不同的過程。我如何使用正確的隔離級別來創建它。

親切的問候

回答

1

交易不能啓動/裏面的Postgres函數結束。如果你想要一些邏輯,使其在功能。在你的情況下,你不需要任何東西 - 如果第一次插入生成異常,事務將中止。但是,如果你需要一些複雜的檢查,作出正確的代碼,例如

if result > 90 then 
    insert ...second insert 
end if; 

運行在交易功能之外啓動它,比如:

begin; 
select * from insert_into_answercomments(1,2); 
end; 
+0

但我怎麼才能稱之爲交易?任何時候我需要做這些雙重插入,如果它不是一個過程,我將如何調用該交易? –

+0

'''開始; select * from insert_into_answercomments(1,2); 結束;''' –

+0

謝謝。隔離級別呢?你有什麼想法是什麼水平?我如何申報? –