'CREATE TRIGGER' 在 PostgreSQL 9.4.2 中使用什么锁(如果有)
What lock, if any, does 'CREATE TRIGGER' use in PostgreSQL 9.4.2
根据 postgres-xl, CREATE TRIGGER
uses the SHARE ROW EXCLUSIVE
lock, but according to the official Postgres docs 对于 SHARE ROW EXCLUSIVE
:
This lock mode is not automatically acquired by any PostgreSQL
command.
您正在将 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-xl, CREATE TRIGGER
uses the SHARE ROW EXCLUSIVE
lock, but according to the official Postgres docs 对于 SHARE ROW EXCLUSIVE
:
This lock mode is not automatically acquired by any PostgreSQL command.
您正在将 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。