You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建函数时为何总是获取pg_proc表的RowExclusiveLock?

关于创建函数时获取pg_proc表RowExclusiveLock的原因

当你执行CREATE OR REPLACE FUNCTION时,PostgreSQL会自动对pg_proc系统表的对应行加RowExclusiveLock,核心原因如下:

  • pg_proc的核心作用:pg_proc是PostgreSQL存储所有函数、存储过程等对象元数据的系统表,你的CREATE OR REPLACE操作本质是对这个表的行进行修改:
    • 若目标函数不存在,会向pg_proc插入一条新行记录;
    • 若目标函数已存在,会更新pg_proc中对应行的元数据(比如函数体、参数定义、返回值类型等)。
  • 锁的默认行为:无论是插入新行还是更新已有行,PostgreSQL都会自动为目标行加上RowExclusiveLock。这是DDL操作的标准锁机制,目的是保证元数据的一致性——防止多个事务同时修改同一个函数的定义,避免出现元数据冲突、脏读或不一致的情况。
  • 锁的并发特性:这种锁不会阻塞其他事务对pg_proc的读操作(比如查询函数定义),只会阻塞其他对同一函数的DDL操作(比如另一个CREATE OR REPLACE或DROP FUNCTION),在保证数据一致的前提下尽可能兼顾并发性能。

你的创建函数代码如下:

CREATE or REPLACE FUNCTION "public".createtable_if_not_exists(schema_name1 text, table_name text,create_stmt text)
RETURNS text AS
$_$
BEGIN
    IF EXISTS(select tablename from pg_catalog.pg_tables where schemaname = schema_name1 AND tablename = table_name) THEN
        RETURN 'Already exists';
    ELSE
        EXECUTE create_stmt;
        RETURN 'Created';
    END IF;
END;
$_$ LANGUAGE 'plpgsql';

内容的提问来源于stack exchange,提问作者Jiuping.Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:17:04