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:
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 |
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
VB 2005 - Introdução a concorrência de dados - Macoratti.net
ADO .NET - Verificando a violação de concorrência - Macoratti.net
Arquitetura de dados desconectada e a concorrência - Macoratti.net
José Carlos Macoratti