Eu sei que posso bloquear uma tabela inteira usando LOCK TABLE
, mas estou curioso para saber se posso obter o mesmo resultado usando a FOR UPDATE
instrução, supondo que todas as transações que atualizam essa tabela selecionam uma linha específica dessa tabela usando FOR UPDATE
no início de sua transação (ou talvez tendo uma tabela separada chamada locks
com uma coluna exclusiva nomeada lock_name
e usando SELECT lock_name FROM locks WHERE lock_name = 'foo' FOR UPDATE
para adquirir um bloqueio antes de cada transação)?
Estou fazendo essa pergunta porque preciso salvar uma estrutura de dados de árvore em uma tabela de banco de dados usando uma lista de adjacência ou uma tabela de fechamento. Quando vários usuários tentam adicionar um novo nó ou realocar uma subárvore, preciso selecionar algumas linhas e fazer alguns cálculos e, em seguida, atualizar a tabela com base nesses cálculos e essa operação não é possível a menos que eu bloqueie a tabela inteira.
Claro, com essa suposição especial, você obtém o mesmo resultado com
LOCK TABLE ... IN EXCLUSIVE MODE
ouSELECT ... FOR UPDATE
. Supondo que por "atualizar essa tabela" , você quer dizer "escrever qualquer coisa" - incluindoINSERT
,DELETE
,MERGE
.A alternativa que você está pensando parece muito com bloqueios consultivos .