晚上好,
我想创建一个具有适当隔离级别的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 $$;
我怀疑的是,交易是否应该在函数内部,或者它是否是一个不同的过程。如何使用正确的隔离级别创建它。
亲切的问候
答案 0 :(得分:1)
事务无法在postgres函数内启动/结束。如果你想要一些逻辑,那就把它放在函数里面。在您的情况下,您不需要任何东西 - 如果第一次插入生成异常,事务中止。但如果您需要一些复杂的检查,请在代码中正确使用,例如
if result > 90 then
insert ...second insert
end if;
在事务中运行函数启动它,例如:
begin;
select * from insert_into_answercomments(1,2);
end;