给定以下 SQL,“ONLY”、“OPERATOR(pg_catalog.=)”和“FOR KEY SHARE”是做什么的?
SELECT 1
FROM ONLY "public"."acmeinstanceinfo" x
WHERE "widgetid" OPERATOR(pg_catalog.=) $1
FOR KEY SHARE OF x
我对 Microsoft SQL 服务器有相当多的经验,但对 PostgreSQL 零经验。对此查询所做的任何见解都会很棒。
给定以下 SQL,“ONLY”、“OPERATOR(pg_catalog.=)”和“FOR KEY SHARE”是做什么的?
SELECT 1
FROM ONLY "public"."acmeinstanceinfo" x
WHERE "widgetid" OPERATOR(pg_catalog.=) $1
FOR KEY SHARE OF x
我对 Microsoft SQL 服务器有相当多的经验,但对 PostgreSQL 零经验。对此查询所做的任何见解都会很棒。
这是在具有外键的表中插入或更新行的效果。请参见以下示例:
现在在一个会话中,启动一个事务并锁定该行
a
:然后,在另一个会话中,尝试将一行插入
b
:发生了什么?
SELECT ... FOR UPDATE
锁定了中的FOR UPDATE
行a
。INSERT
必须确保没有并发事务可以删除引用的行(a
或修改其任何关键列)以避免不一致。为此,它运行
这里
ONLY
确保如果a
是继承层次结构的一部分,则不会影响其他表,并且OPERATOR(pg_catalog.=)
是模式限定运算符的PostgreSQL 语法(由于运算符也受制于search_path
,因此 PostgreSQL 必须确保使用正确的=
运算符)。由于
FOR UPDATE
和FOR KEY SHARE
锁冲突(参见文档),第二个会话被阻塞。SELECT ... FOR NO KEY UPDATE
您可以通过使用而不是来避免该块SELECT ... FOR UPDATE
。仅当您计划更新主键或唯一键列或打算删除该行时,才需要后者。