繁体   English   中英

触发器内部的 PERFORM 是否在与调用者相同的事务中执行 function?

[英]Does PERFORM inside of a trigger execute a function in the same transaction as the caller?

我遇到了一个这样定义的postgres触发器......

CREATE FUNCTION public.my_trigger_func() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
  BEGIN
    PERFORM my_other_func(NEW.my_val);
    RETURN NULL;
  END;
$$;

其他帖子的答案中可以看出(我在 postgres 文档中找不到明确说明):

所有 PostgreSQL 触发器在与触发它们的事务相同的事务中执行。

但是,使用PERFORM调用的 function my_other_func同一个事务中运行? 或者它在这种情况下的行为是什么?

Postgres 版本:

select version();
                                                     version                                                      
------------------------------------------------------------------------------------------------------------------
 PostgreSQL 12.7 (Debian 12.7-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit

该文档指出:

在所有情况下,触发器都是作为触发它的语句的同一事务的一部分执行的,因此如果语句或触发器中的任何一个导致错误,则两者的影响都将回滚。

现在 PostgreSQL function 始终在单个事务中执行。 您可以从文档中的此声明中推断出:

只要调用CALL命令不是显式事务块的一部分,过程就可以在其执行期间提交或回滚事务(然后自动开始新事务)。 function 无法做到这一点。

结果是整个触发器 function my_trigger_func() ,包括从中调用的所有函数,将在与触发它的语句相同的事务中执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM