【问题标题】: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-xlCREATE TRIGGER使用SHARE ROW EXCLUSIVE锁,但根据official Postgres docsSHARE ROW EXCLUSIVE

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

【问题讨论】:

  • 您将 Postgres-XL 与主要的 PostgreSQL 文档进行比较。两种不同的产品,尽管有着共同的历史。 Postgres-XL 有 很多 的变化,来自 PostgreSQL。 CREATE TRIGGER 应该列在 Pg 文档中,但没有,这是一个疏忽。

标签: postgresql triggers postgresql-9.4


【解决方案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 中许多实用程序语句的锁定级别要求已显着降低。
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 2012-10-27
  • 2019-07-03
  • 1970-01-01
相关资源
最近更新 更多