是postgres触发C函数阻塞?

时间:2012-07-04 14:36:37

标签: c postgresql triggers

正如标题所示,我的简短问题是:当使用动态加载的C函数和postgres触发器时,是阻塞还是非阻塞调用?

背景: 我需要在我的数据库上插入/更新/删除后生成一些XML。我考虑过的两个选项是:

  1. 创建一个在I / U / D操作期间写入的事件表,并对这些事件进行守护进程轮询并生成XML
  2. 创建一个C函数,在postgres中生成此XML作为触发器的一部分。
  3. 使用选项2可以提供实时更新,但我担心的是生成XML消息并传输它等会产生一些开销,因此在每次操作之间创建一个xml会导致插入100行会花费更长的时间。 / p>

2 个答案:

答案 0 :(得分:4)

触发器,无论是用C语言还是以任何其他语言实现,都是同步的。一次执行一个触发器,并且在所有触发器都运行之前不会再运行非触发器语句。在PostgreSQL中,触发器按字母顺序执行。

请注意,除非他们采取锁定,否则触发器会在其他事务中执行而不是阻止语句。同一个触发器可以在三个不同的事务中的三个不同的执行点上运行,而第四个事务在同一个表上运行一个以后的触发器,而第五个事务只是在INSERT开始。

因此,触发器会阻止同一事务的后续语句,但不会阻止其他事务上的语句。

BTW,PostgreSQL不提供异步触发器;他们无法返回控制权,因此在继续运行时会执行更多语句。所有触发器都是阻塞和同步的。异步触发器等价物可以通过LISTENNOTIFY或排队机制(如PgQ)来实现。如果您担心速度,请让您的触发器NOTIFY成为LISTEN守护进程,以异步方式执行生成。

答案 1 :(得分:1)

是的,它“阻止”。导致触发器运行的SQL在触发完成之前不会完成。

查看docs中的更多信息。