创建函数时为何总是获取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
相关产品推荐
相关产品推荐

