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”使用啥锁(如果有)的主要内容,如果未能解决你的问题,请参考以下文章

postgresql 错误:类型字符变化的值太长(256)

Function,Object.creat();

IPC_CREAT 有啥用| 0666 C 中 shmget() 函数中的标志

java和postgresql中从日期到长的转换是不一样的

如何将 PostgreSQL“merge_db”(又名 upsert)函数翻译成 MySQL

带有spring boot JPA Postgresql的data.sql未加载