如何确保PostgreSQL函数同一时间仅被调用一次?是否存在函数锁?
PostgreSQL函数单实例执行的锁机制方案
问题描述
我有一个PostgreSQL函数,希望它在任意时刻仅被调用一次,即不允许两个或多个调用同时执行。请问是否存在针对该函数本身的锁机制?
已采纳的解决方案
@calvin-furano提出的方案可行,但存在以下注意事项:
- 所有类型的
advisory locks在Stored Functions中无法正常工作,因为Stored Functions会自动在事务内运行。锁需要在函数结束前(即事务执行期间)释放,这会引入竞态条件,完全违背锁的设计初衷。 - Stored Procedures可以正常工作,因为它没有自动事务包装。缺点是Stored Procedures无法在SELECT语句中使用,因此针对该使用场景,不得不将功能拆分为两步:一步负责加锁和更新,另一步查询已更新的内容。
内容的提问来源于stack exchange,提问作者Ayman
相关产品推荐
相关产品推荐

