Implementação de isolamento em banco de dados
08/10/2015
0
Bom dia,
Estou implementando um sistema em .NET e durante a criação de uma tela com as operações CRUD para registros de veículos me surgiu uma dúvida.
Se alguém estiver editando um veículo e ao mesmo tempo outra pessoa abrir a tela de edição do mesmo registro, as alterações feitas pelas duas pessoas podem se sobreescrever.
Para evitar que isso aconteça, temos que implementar um mecanismo de isolamento de operações, que não permita que duas ou mais pessoas efetuam modificações concorrentes em um mesmo registro.
Eu implemento este mecanismo criando um campo de versão inteiro na tabela a ser protegida. A cada modificação do registro eu incremento a versão. E toda vez que vou fazer modificações eu executo instruções no formato "update [tabela] set .... where Id = [Id] and Versao = [versao carregada para edicao]". Assim se o registro foi modificado por alguém desde que a tela de edição foi carregada, o número de versão terá sido modificado e o update não altera nada. Eu então exibo uma mensagem para o usuário.
A dúvida é a seguinte, existe alguma forma melhor de fazer isso? Existe algum mecanismo do entity framework, ou específico de algum SGBD? Compartilhem soluções utilizadas em outras linguagens também.
Desde já, obrigado!
Estou implementando um sistema em .NET e durante a criação de uma tela com as operações CRUD para registros de veículos me surgiu uma dúvida.
Se alguém estiver editando um veículo e ao mesmo tempo outra pessoa abrir a tela de edição do mesmo registro, as alterações feitas pelas duas pessoas podem se sobreescrever.
Para evitar que isso aconteça, temos que implementar um mecanismo de isolamento de operações, que não permita que duas ou mais pessoas efetuam modificações concorrentes em um mesmo registro.
Eu implemento este mecanismo criando um campo de versão inteiro na tabela a ser protegida. A cada modificação do registro eu incremento a versão. E toda vez que vou fazer modificações eu executo instruções no formato "update [tabela] set .... where Id = [Id] and Versao = [versao carregada para edicao]". Assim se o registro foi modificado por alguém desde que a tela de edição foi carregada, o número de versão terá sido modificado e o update não altera nada. Eu então exibo uma mensagem para o usuário.
A dúvida é a seguinte, existe alguma forma melhor de fazer isso? Existe algum mecanismo do entity framework, ou específico de algum SGBD? Compartilhem soluções utilizadas em outras linguagens também.
Desde já, obrigado!
Michael Silva
Curtir tópico
+ 0
Responder
Posts
21/10/2015
Edison Harada
Você poderia manter um campo com a última data (com hora, minutos e segundos) que o registro foi alterado e ao clicar em editar você também pode ou exibir este campo, ou manter em memória para quando salvar verificar no banco se está data está igual, caso esteja ninguém realizou nenhuma alteração no registro, ou seja, sempre que alterar você verifica se esta data esta igual e depois você atualiza esta data.
Responder
Clique aqui para fazer login e interagir na Comunidade :)