Procurando por uma recomendação sobre recorde de bloqueio dentro de um sistema distribuído

StackOverflow https://stackoverflow.com/questions/207724

  •  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.))

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top