使用TRANSACTION postgres进行双重INSERT

时间:2017-04-25 19:54:09

标签: postgresql transactions plpgsql

晚上好,

我想创建一个具有适当隔离级别的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 个答案:

答案 0 :(得分:1)

事务无法在postgres函数内启动/结束。如果你想要一些逻辑,那就把它放在函数里面。在您的情况下,您不需要任何东西 - 如果第一次插入生成异常,事务中止。但如果您需要一些复杂的检查,请在代码中正确使用,例如

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

在事务中运行函数启动它,例如:

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