Procurando por uma recomendação sobre recorde de bloqueio dentro de um sistema distribuído
-
03-07-2019 - |
Pergunta
Estamos tentando chegar a um padrão de projeto recomendado para a nossa equipe quando se trata de bloqueio de registro. A típica escola de pensamento é algo como isto: 1. O usuário escolhe um registro de uma lista 2. Bloquear o registro com o ID de usuário 3. Coloque o recorde registro bloqueado (sem bloqueio, então alguém bater ya a ele).
Estou faltando alguma coisa, ou que isso parece ser a única maneira de fazer isso? ((No nosso caso Bloqueio Otimista provaria complicado e confuso para os usuários finais. As edições são muitas vezes bastante substancial.))
Solução
O detalhe que poderia fazer a sua administração solução intensivo é se livrar de bloqueios após acidentes ou falhas de conectividade. É aí que a troca entre otimistas e pessimistas de bloqueio se encontra realmente. fundindo manualmente, ou refazer, edições, quando o bloqueio otimista não é uma dor, mas limpando após acidentes em modelos bloqueio pessimistas e persistentes cria suas próprias dores de cabeça (como qualquer um que apoiou usuários de Pervasive backed sistemas nos anos 90 contabilidade irá dizer-lhe longamente dado a oportunidade)
Uma resposta é a utilização de mecanismos de seus RDBMS para gerenciar transações e simultaneidade: Grab o registro com SELECT FOR UPDATE ou qualquer sintaxe seus ternos seu ambiente e nível de isolamento. Se um de seus clientes trava ou fica desligado os rolos de transação de volta e o bloqueio é liberado.
Em um ambiente de conexão como a web ou um ambiente onde as conexões se perder e se recuperou com frequência um modelo baseado sessão com um tempo limite de sessão poderia também trabalho:
- tentativa de limpar o bloqueio existente no registro se for para uma sessão expirada
- tentar bloquear o registro para o sessionid (falha se a etapa anterior falhou)
- Selecione o registro bloqueado (Nenhum registro retornado se a etapa anterior falhou)
Assim, o bloqueio é liberado quando a sessão expirar. Sem ter que remover manualmente fechaduras após falhas e alguma tolerância de problemas de cliente / conectividade. Ele faz ter um pouco mais de trabalho para o código embora.