A cláusula UPDATE without WHERE bloqueia uma tabela no PostgreSQL?


9

A tabela inteira UPDATE(sem WHEREcláusula de especificação ) bloqueia uma tabela no PostgreSQL? Por exemplo, impede que as linhas sejam excluídas / inseridas?

Por exemplo, se eu executar UPDATE t1 SET key = 'value' Posso esperar que nenhuma nova linha seja inserida t1durante a UPDATEexecução?

Se não, posso esperar UPDATEque atualize até as linhas exibidas após o início? (chave não possui DEFAULT 'value'em sua definição)


Se estivesse atualizando linhas que foram inseridas após o início e houvesse um processo que estava continuamente inserindo linhas, isso não significa que a instrução de atualização nunca seria concluída?
Joe W

bom ponto! Sim, é quase impossível UPDATEser implementado dessa maneira para atualizar as linhas recém-inseridas.
origaminal 30/09/19

Não, apenas as linhas que foram alteradas serão bloqueadas. Um UPDATE nunca bloqueia a tabela inteira.
a_horse_with_no_name 30/09/19

Respostas:


15

Uma UPDATE sem uma cláusula WHERE bloqueará todas as linhas da tabela, mas não bloqueará a própria tabela para DML.

As linhas não podem ser excluídas de uma transação diferente porque estão bloqueadas.

Mas você pode inserir novas linhas sem problemas (supondo que elas não violem nenhuma restrição).

Qualquer linha inserida após o UPDATE não será vista pela instrução UPDATE e, portanto, não será alterada.


você pode compartilhar os links dos documentos? Não encontrei muita documentação oficial dizendo exatamente sobre o que é UPDATEsem WHERE.
origaminal 30/09/19

E as linhas ATUALIZADAS de outra transação também falharão devido aos bloqueios de linha, correto?
precisa saber é o seguinte

11
@origaminal O documento em questão está em postgresql.org/docs/current/explicit-locking.html , os quatro últimos são o que você chama de 'bloqueios de tabela' - embora até bloqueios permissivos ainda sejam uma forma de bloqueio de tabela que impedir tentativas de bloquear automaticamente.
SilverbackNet
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.