Como faço para implementar “bloqueio pessimista” em um aplicativo asp.net?

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu gostaria de alguns conselhos de alguém experiente com implementando algo como "bloqueio pessimista" em um aplicativo asp.net. Este é o comportamento que eu estou procurando:

  1. Um usuário abre ordem # 313
  2. tentativas o usuário B para a ordem aberta nº313 mas é dito que o utilizador A tem tido a ordem aberto exclusivamente para X minutos.

Uma vez que não implementaram essa funcionalidade antes, eu tenho algumas perguntas de design:

  • Que dados devem i anexar ao registro de pedido? Estou considerando:
    • LockOwnedBy
    • LockAcquiredTime
    • LockRefreshedTime

Eu consideraria um registro desbloqueado se o LockRefreshedTime <. (Agora - 10 min)

  • Como posso garantir que os bloqueios não são mantidos por mais tempo do que o necessário, mas não expiram inesperadamente quer?

Eu sou muito confortável com jQuery assim abordagens que fazem uso do script de cliente são bem-vindos. Esta seria uma aplicação web interna para que eu possa ser bastante liberal com o meu uso de largura de banda / ciclos. Eu também estou querendo saber se "bloqueio pessimista" é um termo apropriado para este conceito.

Foi útil?

Solução

Parece que você está a maior parte do caminho até lá. Eu não acho que você realmente precisa LockRefreshedTime, porém, ele realmente não acrescenta nada. Você pode muito bem usar o LockAcquiredTime para decidir quando um bloqueio tornou-se obsoleto.

A outra coisa que você vai querer fazer é ter certeza que você faça uso de transações. Você precisa envolver a verificação ea fixação do bloqueio dentro de uma transação de banco de dados, de modo que você não acabar com dois usuários que pensam que têm um bloqueio válido.

Se você tem tarefas que exigem ganhando bloqueios em mais de um recurso (ou seja, mais de um registro de um determinado tipo ou mais de um tipo de registro), então você precisa aplicar os bloqueios na mesma ordem onde quer que você faça o bloqueio . Caso contrário, você pode ter um bloqueio morto, onde um pouco de código tem registro Um bloqueado e está querendo bloquear registro B e outro pouco de código tenha B bloqueado e está à espera de registro A.

Quanto à forma como você garantir bloqueios não são liberados de forma inesperada. Certifique-se de que se você tiver qualquer processo de longa duração, que poderia correr mais do que o seu tempo limite de bloqueio, que ele atualiza seu bloqueio durante a sua execução.

O termo "bloqueio explícito" também é usado para descrever este momento do bloqueio.

Outras dicas

Eu tenho feito isso manualmente.

  • Guarde a chave primária do registro a uma tabela de bloqueio, e gravar marca modo de atributo para editar.
  • Quando outro usuário tentar seleccionar este registro, indicam do usuário único registro pronto.
  • Tenha um set-up tempo máximo para bloquear os registros.
  • dados da página
  • Atualizar para registros bloqueados. Enquanto um utilizador é permitido fazer alterações, todos os outros usuários só estão autorizados a verificar.

tabela de bloqueio devem ter projeto semelhante a este:

User_ID, //who locked
Lock_start_Time,
Locked_Row_ID(Entity_ID), //this is primary key of the table of locked row.
Table_Name(Entity_Name) //table name of the locked row.

restante lógica é algo que você tem que descobrir.

Esta é apenas uma idéia que eu implementei 4 anos atrás a pedido especial de um cliente. Depois que o cliente ninguém me pediu novamente para fazer algo semelhante, então eu não ter conseguido qualquer outro método.

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