Dado o seguinte SQL, o que "ONLY", "OPERATOR(pg_catalog.=)" e "FOR KEY SHARE" fazem?
SELECT 1
FROM ONLY "public"."acmeinstanceinfo" x
WHERE "widgetid" OPERATOR(pg_catalog.=) $1
FOR KEY SHARE OF x
Eu tenho uma boa experiência com o servidor Microsoft SQL, mas zero com o PostgreSQL. Qualquer insight sobre o que essa consulta está fazendo seria ótimo.
Este é o efeito de inserir ou atualizar uma linha em uma tabela que possui uma chave estrangeira. Veja o exemplo a seguir:
Agora, em uma sessão, inicie uma transação e bloqueie a linha em
a
:Então, em outra sessão, tente inserir uma linha em
b
:O que aconteceu?
O
SELECT ... FOR UPDATE
levou umFOR UPDATE
bloqueio na linha ema
.O
INSERT
deve certificar-se de que nenhuma transação simultânea possa excluir a linha referenciadaa
(ou modificar qualquer uma de suas colunas-chave) para evitar inconsistências.Para isso, é executado
Aqui
ONLY
garante que nenhuma outra tabela seja afetada sea
for parte de uma hierarquia de herança, eOPERATOR(pg_catalog.=)
é a sintaxe do PostgreSQL para um operador qualificado pelo esquema (já que os operadores também estão sujeitos asearch_path
, o PostgreSQL precisa garantir que o=
operador correto seja usado).Como
FOR UPDATE
eFOR KEY SHARE
travas estão em conflito (veja a documentação ), a segunda sessão é bloqueada.Você pode evitar esse bloco usando
SELECT ... FOR NO KEY UPDATE
em vez deSELECT ... FOR UPDATE
. O último só é necessário se você planeja atualizar uma coluna de chave primária ou exclusiva ou se pretende excluir a linha.