PostgreSQL:一次只允许一个存储过程实例 运行

PostgreSQL: Allow only one instance of stored procedure to run at a time

我在 Postgres 上有一个存储过程,它处理大量数据并且需要很长时间才能完成。 在我的应用程序中,有可能 2 个进程或调度程序可以同时 运行 这个过程。我想知道数据库中是否有内置机制只允许此过程的实例在数据库级别 运行。

我在互联网上搜索过,但没有找到任何具体内容。

没有内置任何东西来定义过程(或函数)以防止并发执行。

但您可以使用 advisory locks 来实现类似的目的。

在程序的最开始,您可以添加如下内容:

perform pg_advisory_lock(987654321);

然后等待获取锁。如果第二个会话调用该过程,它将不得不等待。

确保在使用 pg_advisory_unlock() 的过程结束时 释放 锁,因为在提交事务时它们不会被释放。

如果您在其他地方使用咨询锁,请确保您使用的钥匙不能在其他地方使用。