1

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

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

  1. 创建一些在 I/U/D 操作期间写入使用的事件表,并对这些事件进行守护程序轮询并生成 XML
  2. 创建一个 C 函数来生成此 XML 作为 postgres 中触发器的一部分。

使用选项 2 将提供实时更新,但我担心在生成 XML 消息和传输它等方面会有一些开销,因此由于在每个操作之间创建一个 xml,插入 100 行将花费更长的时间。

4

2 回答 2

4

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

请注意,除非它们获得锁,否则触发器不会阻塞其他事务中的语句。同一个触发器可以在三个不同事务中的三个不同执行点运行,而第四个事务在同一个表上运行稍后的触发器,而第五个事务刚刚开始一个INSERT.

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

顺便说一句,PostgreSQL 不提供异步触发器;他们无法返回控制权,因此在继续运行时会执行更多语句。所有触发器都是阻塞和同步的。异步触发器等价物通过LISTENNOTIFY/或队列机制(如PgQ. 如果您担心速度,请触发NOTIFY一个LISTEN异步生成的 ing 守护进程。

于 2012-07-05T12:39:01.867 回答
1

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

在文档中查看更多信息。

于 2012-07-04T15:09:46.097 回答