使用TRANSACTION postgres进行双重INSERT

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用TRANSACTION postgres进行双重INSERT相关的知识,希望对你有一定的参考价值。

晚上好,

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

我怀疑的是,交易是否应该在函数内部,或者它是否是一个不同的过程。如何使用正确的隔离级别创建它。

亲切的问候

答案

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

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

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

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

以上是关于使用TRANSACTION postgres进行双重INSERT的主要内容,如果未能解决你的问题,请参考以下文章

Postgres的双引号问题

忽略JPA查询超时参数但@Transaction注释有效

迄今为止的 Postgres 双精度

postgres查询不匹配负双精度值

Java JDBC Postgres copyIn无法识别行尾并填充双引号

Postgres 选择 BTREE 而不是 BRIN 索引