ADO.NET - A arquitetura de dados desconectada e a concorrência de dados

ADO.NET consiste de conjunto de classes definidas pela plataforma .NET Framework que você pode usar para acessar dados e assim desenvolver suas aplicações de acesso a dados. Para trabalhar com os dados usando ADO.NET você usa uma variedade de objetos . A figura abaixo mostra os objetos básicos que você usa para desenvolver aplicações Windows com acesso a dados.

Embora a arquitetura desconectada de dados implementada pelo objeto DataSet traga muitos ganhos ela também tem suas desvantagens. Uma delas é o conflito que pode ocorrer quando dois ou mais usuários  tentam atualizar os dados em uma mesma linha de uma dada tabela (mesmo registro). A este problema chamamos concorrência.

Isto ocorre pois desde que um programa retorna dados de um banco de dados , a conexão com o banco de dados é finalizada e , como resultado o sistema gerenciador do banco de dados não pode gerencias o processo de atualização. Vamos ilustrar o processo na figura abaixo:

-Dois usuários obtiveram dados da tabela Produtos do banco de dados.

-Uma cópia da tabela Produtos fica armazenada no computador de cada um deles.

-Suponha que o usuário 1 altere o preço do produto para o produto de código 100 e atualize o banco de dados

-Suponha também que o usuário 2 modifique a quantidade do produto para o produto de código 100 ( o mesmo produto) e tente atualizar o banco de dados.

- O que será que vai acontecer ???

Ora , meu caro Watson , elementar !!!! A resposta é : VAI DEPENDER DO CONTROLE DE CONCORRÊNCIA USADO PELO PROGRAMA.

Quando você usa ADO.NET pode optar pois três modos distintos na maneira de como você vai tratar o problema da concorrência.

O modo padrão usado na ADO.NET é a concorrência otimista , que verifica se uma linha (registro) sofreu alteração desde que ele foi obtida do banco de dados. Se o registro sofreu alguma alteração , a atualização do registro (update) ou sua exclusão (delete) será recusada e erro será gerado e uma exceção devido a concorrência será disparada.

Na concorrência pessimista um registro fica indisponível aos outro usuários do momento que foi obtido até ocorrer sua atualização no banco de dados. Você usaria este tipo de tratamento por duas razões:

  1. Em algumas situações há uma alta contenção para os mesmos registros , o custo de travar o registro é menor do que o custo em desfazer a operação se houver um conflito devido a concorrência
  2. Em situações onde é prejudicial para o registro sofre alterações durante o curso de uma transação.
Nota: Este tipo de tratamento de concorrência não é possível na arquitetura desconectada de dados.

A outra forma com a qual ADO.NET pode tratar a concorrência é  - quem chegar por último tem a prioridade - onde não é feita uma verificação sobre o registro que esta sendo atualizado , neste caso , o último usuário que atualizar ou excluir o registro irá sobrepor qualquer alteração feita no registro anteriormente.

Ao  desenvolver sua aplicação você deve mensurar se a concorrência vai ser um problema , e , neste caso usar técnicas que limitem os erros gerados pela concorrência. Uma forma de fazer isto , se você estiver usando um DataSet , é atualizar o banco de dados com frequência de maneira que outros usuários possam sempre obter os dados atualizados. O programa irá tem atualizar o DataSet frequentemente de forma que ele vai sempre estar com as mudanças recentes feitas pelos outros usuários.

Outra forma de contornar o problema da concorrência é obter e trabalhar somente com um registro por vez; desta maneira , fica mais difícil dois usuários atualizarem o mesmo registro no mesmo momento.  Se você obter os dados de um tabela inteira , a chance de dois usuários tentarem atualizar a mesma tabela com as mesmas linhas aumenta , mesmo que as alterações nos registros não tenha sido feita no mesmo momento.

Resumindo :

O que acontece quando dois usuários tentam atualizar o mesmo registro:

Como evitar os erros devido a concorrência :

Nota: O evento DataAdapter.RowUpdated pode ser usado em conjunto com as técnicas descritas para fornecer um aviso para sua aplicação da violação ocorrida na concorrência otimista. RowUpdated ocorre depois de cada tentativa de atualizar um registro modificado de um DataSet.

Isto permite a você fazer um tratamento no código ,incluindo o processamento quando uma exceção ocorrer. O objeto RowUpdateEventArgs retorna a propriedade RecordsAffected com o número de registros afetados por um comando update. Se o valor retornado for igual a zero isto indica que ocorreu um erro devido a violação da concorrência otimista.

Uma outra forma seria a inclusão de uma coluna do tipo timestamp na sua tabela de forma a identificar a data e a hora que o registro foi atualizado

ADO.NET também fornece o objeto DBConcurrencyException para ajudar no tratamento dos erros devidos a concorrência. Este objeto retorna o registro que causou o erro bem como a mensagem associada com atualização que falhou. Abaixo um exemplo de utilização do objeto:

Try
   SqlDataAdapter1.Update(myDataset)
Catch ex As DBConcurrencyException
   Dim customErrorMessage As String
   customErrorMessage = ex.Message & vbCrLf
   customErrorMessage += Ctype(ex.Row.Item(0), String)
   MessageBox.Show(customErrorMessage)
End Try

 

 

    João 8:45 Mas porque eu digo a verdade, não me credes.

    João 8:46 Quem dentre vós me convence de pecado? Se digo a verdade, por que não me credes?

    João 8:47 Quem é de Deus ouve as palavras de Deus; por isso vós não as ouvis, porque não sois de Deus.

 

Veja os Destaques e novidades do SUPER DVD VB 2013 (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# 2013 com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti