标记为STABLE的PostgreSQL函数是否允许获取锁?
标记为STABLE的PostgreSQL函数是否允许获取锁?
答案是允许的,但需要符合STABLE函数的核心约束条件。
先明确PostgreSQL官方对STABLE函数的定义:
STABLE表示函数不能修改数据库,且在单次表扫描中,对于相同参数值会始终返回相同结果,但在不同SQL语句间结果可能变化。这适用于结果依赖数据库查询、参数变量(如当前时区)等的函数
STABLE的核心限制在于禁止修改数据库状态,以及保证同一次表扫描内相同参数的结果一致性。而获取锁(比如共享锁SHARE)本身属于读取操作的范畴,并不会修改数据,只要锁的获取行为不会导致函数在同一次扫描中返回不一致的结果,就完全符合STABLE的要求。
举个实际的例子:你可以在STABLE函数中执行SELECT col FROM tbl WHERE id = $1 FOR SHARE,这样既获取了目标行的共享锁(防止其他事务修改它),又因为查询的结果在同一次扫描中是稳定的(相同id参数返回的行数据不会变),完全满足STABLE函数的定义。
需要注意的是,STABLE函数不能执行会修改数据库的操作,因此像FOR UPDATE这类和写操作绑定的锁(通常用于后续修改),虽然语法上可能能执行,但违背了STABLE“不能修改数据库”的约束,不应该在STABLE函数中使用。
内容的提问来源于stack exchange,提问作者the paul
相关产品推荐
相关产品推荐

