PostgreSQL 9.4.2中,“CREATE TRIGGER”使用了哪种锁,如果有的话?

5
根据postgres-xlCREATE TRIGGER使用SHARE ROW EXCLUSIVE锁,但根据Postgres官方文档中关于SHARE ROW EXCLUSIVE的说明:

此锁模式不会被任何PostgreSQL命令自动获取。


你正在比较Postgres-XL和主要的PostgreSQL文档。虽然两个产品有共同的历史,但它们是两个不同的产品。Postgres-XL与原版PostgreSQL相比有很多改变。CREATE TRIGGER应该列在Pg文档中,但事实上没有列出来,这是一个疏忽。 - Craig Ringer
1个回答

8

您正在比较Postgres-XL和主要的PostgreSQL文档。尽管有着共同的历史,但这是两个不同的产品。Postgres-XL与标准的PostgreSQL有很多不同之处。

CREATE TRIGGER应该在Pg文档中列出,但实际上却没有,这是一个疏忽。

快速查看源代码可以发现,CREATE TRIGGER需要使用ShareRowExclusiveLock,所以在这种情况下,XL的文档与PostgreSQL的行为相匹配。

您可以通过执行类似以下的操作来自行检查:

CREATE TABLE test();

CREATE OR REPLACE FUNCTION dummy_tg() RETURNS TRIGGER
LANGUAGE plpgsql AS $$ BEGIN END; $$;

BEGIN;

CREATE TRIGGER blah BEFORE INSERT ON test FOR EACH ROW EXECUTE PROCEDURE dummy_tg();

\x

SELECT * FROM pg_locks 
WHERE pid = pg_backend_pid() 
AND relation = 'test'::regclass;

ROLLBACK;

这表明我对资料的阅读理解是错误的,原因如下:

locktype | relation
mode     | AccessExclusiveLock

这个操作需要获取AccessExclusiveLock锁。


1
在这里进行评论:我尝试了使用Postgres 11.2,它对我生成了ShareRowExclusiveLock,在所有运行此代码的情况下。 - KdgDev
2
@KdgDev 自从5年前写下这篇文章以来,PostgreSQL中许多实用程序语句的锁定级别要求已经显著降低。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接