根据postgres-xl,
CREATE TRIGGER
使用SHARE ROW EXCLUSIVE
锁,但根据Postgres官方文档中关于SHARE ROW EXCLUSIVE
的说明:
此锁模式不会被任何PostgreSQL命令自动获取。
CREATE TRIGGER
使用SHARE ROW EXCLUSIVE
锁,但根据Postgres官方文档中关于SHARE ROW EXCLUSIVE
的说明:
此锁模式不会被任何PostgreSQL命令自动获取。
您正在比较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锁。
CREATE TRIGGER
应该列在Pg文档中,但事实上没有列出来,这是一个疏忽。 - Craig Ringer