PostgreSQL 9.4.2 中的“CREATE TRIGGER”使用啥锁(如果有)
Posted
技术标签:
【中文标题】PostgreSQL 9.4.2 中的“CREATE TRIGGER”使用啥锁(如果有)【英文标题】:What lock, if any, does 'CREATE TRIGGER' use in PostgreSQL 9.4.2PostgreSQL 9.4.2 中的“CREATE TRIGGER”使用什么锁(如果有) 【发布时间】:2015-11-24 19:58:16 【问题描述】:根据postgres-xl,CREATE TRIGGER
使用SHARE ROW EXCLUSIVE
锁,但根据official Postgres docs为SHARE ROW EXCLUSIVE
:
任何 PostgreSQL 都不会自动获取此锁定模式 命令。
【问题讨论】:
您将 Postgres-XL 与主要的 PostgreSQL 文档进行比较。两种不同的产品,尽管有着共同的历史。 Postgres-XL 有 很多 的变化,来自 PostgreSQL。CREATE TRIGGER
应该列在 Pg 文档中,但没有,这是一个疏忽。
【参考方案1】:
您将 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。
【讨论】:
在此发表评论:我在 postgres 11.2 上尝试过此操作,它会在此代码的所有运行中为我生成一个 ShareRowExclusiveLock。 @KdgDev 自 5 年前编写以来,PostgreSQL 中许多实用程序语句的锁定级别要求已显着降低。以上是关于PostgreSQL 9.4.2 中的“CREATE TRIGGER”使用啥锁(如果有)的主要内容,如果未能解决你的问题,请参考以下文章
IPC_CREAT 有啥用| 0666 C 中 shmget() 函数中的标志