PostgreSQL Concorrência

votos
5

Em um projeto que estou trabalhando, há uma mesa com um gatilho na atualização, que monitora se uma coluna booleana mudou (ex .: falsa -> verdadeiros = fazer alguma ação). Mas esta ação só pode ser feito uma vez para uma linha.

Haverá vários clientes que acessam o banco de dados, para que eu possa supor que, eventualmente, vários clientes vão tentar atualizar a mesma linha coluna em paralelo.

Será que o update gatilho em si lidar com a própria concorrência, ou eu preciso fazê-lo em uma transação e bloquear manualmente a mesa?

Publicado 26/11/2008 em 00:40
fonte usuário
Em outras línguas...                            


1 respostas

votos
17

Triggers não lidar com simultaneidade e PostgreSQL deve fazer a coisa certa ou não usar transações explícitas.

PostgreSQL utiliza bloqueio otimista que significa a primeira pessoa a realmente atualizar a linha recebe um bloqueio nessa linha. Se uma segunda pessoa tenta atualizar a linha, sua instrução de atualização espera para ver se o primeiro compromete sua mudança ou rolos de volta.

Se a primeira pessoa comete, a segunda pessoa recebe um erro, em vez de sua mudança passando e apagando uma mudança que poderia ter sido interessante para eles.

Se a primeira pessoa reverte, atualização un-blocos da segunda pessoa, e passa por normalmente, porque agora ele não está indo para substituir qualquer coisa.

A segunda pessoa também pode usar a NOWAITopção, o que torna o erro acontecer imediatamente em vez de bloquear, se os seus conflitos de atualização com uma mudança sem solução.

Respondeu 26/11/2008 em 00:55
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more