msdn13_capa.gif

Clique aqui para ler todos os artigos desta edição

Concorrências de dados com o ADO.NET – parte II

por John Papa

Este artigo discute

Este artigo usa as seguintes tecnologias:

·          Armazenamento e atualização de dados no DataSet

ADO.NET, C#

 

Download:

DataPoints0410.exe (145KB)

Chapéu

ADO.NET

 

 

O desenvolvimento corporativo vem tendendo a um modelo desconectado nos últimos anos, e no desenvolvimento em ADO.NET não é diferente. Embora o modelo desconectado do DataSet do ADO.NET ofereça grande flexibilidade, a adaptabilidade também significa um controle menos rigoroso sobre atualizações de dados do que o que é possível no modelo de acesso a dados conectado. Um dos problemas relacionados é a concorrência de dados. Neste artigo enfocarei as violações de concorrência, que ocorrem quando várias linhas podem ser salvas no banco de dados em um único lote.

Quando ocorre uma violação de concorrência, a propriedade ContinueUpdateOnError de SqlDataAdapter informa a SqlDataAdapter para que gere uma exceção ou ignore a violação de concorrência. Demonstrarei como mostrar exatamente porque ocorreu uma violação de concorrência, definindo a propriedade ContinueUpdateOnError como verdadeira e usando uma série de DataViews ligados a objetos DataGrid do ASP.NET. Esses DataGrids usarão enumeradores DataViewRowState para mostrar as alterações feitas em um DataSet.

O SqlDataAdapter também possui alguns eventos, inclusive RowUpdating e RowUpdated, que podem ser bastante práticos. Para ilustrar sua utilização, mostrarei também como lidar com concorrência, criando um handler para o evento RowUpdated.

No artigo do mês passado, descrevi o tratamento de violações de concorrência e apresentei um exemplo de violação que ocorreu quando uma única linha foi atualizada de uma vez. Nessa situação, a definição da propriedade ContinueUpdateOnError de SqlDataAdapter como falsa informou ao SqlDataAdapter para gerar uma exceção assim que fosse encontrada uma violação de concorrência. Essa técnica é ideal ao salvar uma única linha ou quando se estiver tentando salvar várias linhas e quiser que ou todas sejam confirmadas ou que todas falhem. Contudo, se você quiser salvar as linhas que não encontrarem violações de concorrência e exibir as linhas que causarem tais violações, deverá usar outra técnica.

 

Planejamento para concorrências

Os exemplos apresentados aqui usam concorrências otimistas; portanto, os dados somente são bloqueados durante a atualização. Isto deixa tempo de sobra para que os usuários leiam os mesmos dados, tentem atualizá-los e colidam uns com os outros. Dessa forma, é importante implementar a detecção de violações de concorrência, que captura as tentativas de modificação de registros de um usuário que já foi modificado desde a última vez que os dados foram recuperados por esse usuário.

Em vez de ditar como tratar uma violação de concorrência, o ADO.NET permite que o desenvolvedor decida como lidar com ela. O ADO.NET gera uma exceção de concorrência de dados (DBConcurrencyException) quando uma instrução UPDATE afeta zero linhas. Se uma cláusula WHERE de uma instrução UPDATE contiver somente a chave ou as chaves primárias, ele implementará o método last-in wins, que substitui qualquer valor que existir na linha. O problema dessa técnica é que as alterações feitas pelo usuário podem ser substituídas e perdidas sem qualquer aviso.

Acrescentando-se outra condição à cláusula WHERE de uma instrução UPDATE, além das chaves primárias, é possível capturar uma violação de concorrência. Há algumas maneiras de se conseguir isso, como a inserção de uma coluna timestamp ou uma coluna datetime à tabela, e a utilização desses campos na cláusula WHERE da instrução UPDATE. Se você usar uma coluna TIMESTAMP do servidor SQL, ela se atualizará automaticamente com um novo valor sempre que for alterado algum valor em sua coluna. Se você usar uma coluna DATETIME, terá que atualizar seu valor de maneira explícita ou por algum outro meio, como um gatilho AFTER UPDATE, como mostrado a seguir:

...

Quer ler esse conteúdo completo? Tenha acesso completo