Existe uma maneira para selecionar linhas no PostgreSQL que não estão bloqueados? Eu tenho um aplicativo multi-threaded que vai fazer:
Select... order by id desc limit 1 for update
sobre uma mesa.
Se vários segmentos executar essa consulta, ambos tentam puxar a mesma linha.
Tem-se a bloqueio de linha, os outros blocos e, em seguida, falhar após a primeira atualiza a linha. O que eu realmente gostaria é para o segundo segmento para obter a primeira linha que corresponda à WHEREcláusula e ainda não estiver bloqueado.
Para esclarecer, eu quero que cada thread para atualizar imediatamente a primeira linha disponível após fazer a seleção.
Assim, se houver linhas com ID: 1,2,3,4, o primeiro segmento viria em, selecione a linha com ID=4e imediatamente atualizá-lo.
Se durante essa operação um segundo thread vem, eu gostaria que ele para obter linha com ID=3e imediatamente atualizar essa linha.
Para Share não vai conseguir isso nem com nowaitcomo a WHEREcláusula irá coincidir com a linha bloqueada (ID=4 in my example). Basicamente o que eu gostaria é algo como E NÃO BLOQUEADO na WHEREcláusula.
Users
-----------------------------------------
ID | Name | flags
-----------------------------------------
1 | bob | 0
2 | fred | 1
3 | tom | 0
4 | ed | 0
Se a consulta for Select ID from users where flags = 0 order by ID desc limit 1 e quando uma linha é devolvido o próximo passo é Update Users set flags = 1 where ID = 0, então eu gostaria que o primeiro segmento em agarrar a linha com ID 4ea próxima para pegar a linha com ID 3.
Se eu acrescentar For Update para o Select, em seguida, o primeiro segmento recebe a linha, o segundo um blocos e, em seguida, retorna nada porque uma vez que a primeira transação compromete a WHEREcláusula não é mais satisfeito.
Se eu não usar For Update, então eu preciso adicionar uma cláusula WHERE na atualização posterior (onde as bandeiras = 0) para que apenas um thread pode atualizar a linha.
O segundo segmento será selecionar a mesma linha como o primeiro, mas a atualização da segunda linha irá falhar.
De qualquer maneira o segundo segmento não consegue obter uma linha e atualização porque eu não posso obter o banco de dados para dar linha 4 para a primeira linha e linha 3 para o segundo segmento as transações se sobrepõem.













