2017-04-25 6 views
0

おはよう、TRANSACTIONを使用した二重INSERT 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

'' 'begin; select * from insert_into_answercomments(1,2); 終了; '' ' –

+0

ありがとうございます。隔離レベルはどうですか?どのようなレベルのアイデアがありますか?どうすれば宣言できますか? –

関連する問題