Introdução a simultaneidade de dados do ADO.NET

Quando vários usuários tentarem modificar os dados ao mesmo tempo, os controles precisa ser estabelecida para impedir modificações de um usuário de afetar negativamente as modificações de usuários simultâneos.O sistema de manipular o que acontece nessa situação é chamado controle de simultaneidade .

Tipos de simultaneidade de controle

Em geral, há três maneiras para gerenciar de simultaneidade em um banco de dados:

  • Controle de simultaneidade pessimista: Uma linha não disponível para os usuários a time o registro é procurado até que seja atualizado no banco de dados.

  • Controle de simultaneidade otimista: Uma linha não disponível para outros usuários somente enquanto os dados realmente está sendo atualizados.A atualização examina o banco de dados na linha e determina se as alterações foram feitas.Tentando atualizar um registro que já tenha sido alterada resulta em uma Violação de concorrência.

  • "Por último no WINS": Uma linha não disponível para outros usuários somente enquanto os dados realmente está sendo atualizados.No entanto, nenhum esforço é feito para comparar as atualizações com o registro original; o registro é simplesmente gravado, potencialmente sobrescrever qualquer alteração feita por outros usuários desde que atualizou pela última vez os registros.

Simultaneidade pessimista

Concorrência pessimista é normalmente usada para dois motivos.Primeiro, em algumas situações é alta contenção para os mesmos registros.O custo de colocar os bloqueios nos dados é menor que o custo de reverter as alterações quando ocorrem conflitos de simultaneidade.

Concorrência pessimista também é útil para situações em que ele é prejudicial para o Registro para alterar durante o curso de uma transação.Um bom exemplo é um aplicativo de inventário.Considere um representante da empresa verificação de inventário de um cliente potencial.Você geralmente deseja bloquear o registro até que um pedido é gerado, que geralmente seria sinalizar o item com um status de ordenada e removê-lo do estoque disponível.Se nenhum pedido é gerado, o bloqueio poderia ser liberado de modo que outros usuários a verificação de inventário obter uma contagem do estoque disponível precisa.

No entanto, controle de simultaneidade pessimista Não é possível em uma arquitetura desconectada.As conexões são abertas somente longo o suficiente para ler os dados ou para atualizá-lo, portanto, bloqueios não podem ser mantidos por longos períodos.Além disso, um aplicativo que contém até bloqueios por longos períodos é não escalonável.

Simultaneidade otimista

No concorrência otimista, bloqueios estão definidos e mantidos somente enquanto o banco de dados está sendo acessado.Os bloqueios impedir que outros usuários tentando atualizar registros no mesmo instante.Os dados estão sempre disponíveis, exceto para o momento exato que uma atualização está colocando local.Para obter mais informações, consulte Usando simultaneidade otimista.

Quando uma atualização é tentada, a versão original de uma linha alterada é comparada com a linha existente no banco de dados.Se as duas forem diferentes, a atualização falhará com um erro de simultaneidade.Backup é nesse momento você reconciliar as duas linhas, usar lógica comercial que você criar.

Pela última vez no WINS

Com "última no WINS," é feita nenhuma verificação dos dados originais e a atualização é simplesmente gravada o banco de dados.Ele é compreendido que o cenário a seguir pode ocorrer:

  • O usuário A agrupa um registro do banco de dados.

  • O usuário B agrupa o mesmo registro do banco de dados, modifica-lo e grava o registro atualizado novamente para o banco de dados.

  • O usuário A modifica o Registro 'anterior' e grava essa volta para o banco de dados.

Na situação acima, as alterações do usuário B nunca foram vistas pelo usuário a.Ter certeza de que essa situação é aceitável se você planeja usar a abordagem "pela última vez em vence" do controle de simultaneidade.

Controle de concorrência no ADO.NET e Visual Studio

O ADO.NET e Visual Studio usam concorrência otimista, porque a arquitetura de dados se baseia em dados desconectados.Portanto, você precisará adicionar lógica comercial para resolver problemas com concorrência otimista.

Se você optar por usar simultaneidade otimista, há duas maneiras Geral para determinar se ocorreram alterações: a abordagem de versão (números de versão true ou carimbos de data) e a abordagem salvar valores de todos.

A abordagem número versão

Na abordagem de número de versão, o registro a ser atualizado deve ter uma coluna que contém uma data - carimbo de data/hora ou número de versão.A data - um número de versão ou carimbo de data/hora é salvo no cliente quando o registro é lido.Esse valor é feito, em seguida, parte da atualização.

Uma maneira para tratar de simultaneidade é para atualizar somente se Valor na cláusula WHERE corresponde ao valor no Registro.A representação SQL dessa abordagem é:

UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 
WHERE DateTimeStamp = @origDateTimeStamp

Como alternativa, a comparação pode ser feita usando o número de versão:

UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 
WHERE RowVersion = @origRowVersionValue

Se correspondência, os carimbos de data e hora ou números de versão o registro na armazenamento de dados não foi alterado e pode ser atualizado com segurança com os novos valores de DataSet.Um erro será retornado se eles não coincidem.Você pode escrever código para implementar essa forma de simultaneidade check in Visual Studio.Você também precisará escrever código para responder a quaisquer conflitos de atualização.Para manter a data - carimbo de data/hora ou número de versão precisas, você precisará configurar um disparador na tabela para atualizá-lo quando uma alteração em uma linha ocorre.

A abordagem economia-all-valores

Uma alternativa ao uso de uma data - carimbo de data/hora ou número de versão é obter cópias de todos os campos quando o registro é lido.The DataSet objeto do ADO.NET mantém duas versões de cada registro modificado: uma versão original (que foram originalmente lidos da fonte de dados) e uma versão modificada, que representa as atualizações do usuário.Ao tentar gravar o registro de volta para o fonte de dados, os valores originais na linha de dados são comparados com o registro de fonte de dados.Se forem iguais, isso significa que o registro do banco de dados não foi alterado desde que ele foi lido.Nesse caso, os valores alterados do conjunto de dados são gravados com êxito o banco de dados.

Cada comando adaptador de dados tem uma coleção de parâmetros para cada dos seus quatro comandos (DELETE, INSERT, SELECT e UPDATE).Cada comando tem parâmetros para ambos os valores originais, bem como os valores atuais (ou modificado).

Observação:

Somente a adição de novos registros (o comando INSERT) requer os valores atuais desde existir nenhum registro original e remover registros (o comando DELETE) só exige os valores originais para localizar o Registro para excluir.

O exemplo a seguir mostra o texto de comando para um comando DataSet que atualiza uma tabela Customers típica.O comando é especificado para dinâmico SQL e concorrência otimista.

UPDATE Customers SET CustomerID = @currCustomerID, CompanyName = @currCompanyName, ContactName = @currContactName,
       ContactTitle = currContactTitle, Address = @currAddress, City = @currCity, 
       PostalCode = @currPostalCode, Phone = @currPhone, Fax = @currFax
WHERE (CustomerID = @origCustomerID) AND (Address = @origAddress OR @origAddress IS NULL AND Address IS NULL) AND (City = @origCity OR @origCity IS NULL AND City IS NULL)
      AND (CompanyName = @origCompanyName OR @origCompanyName IS NULL AND CompanyName IS NULL) AND (ContactName = @origContactName OR @origContactName IS NULL AND ContactName IS NULL) AND (ContactTitle = @origContactTitle OR @origContactTitle IS NULL AND ContactTitle IS NULL) 
      AND (Fax = @origFax OR @origFax IS NULL AND Fax IS NULL) AND (Phone = @origPhone OR @origPhone IS NULL AND Phone IS NULL) AND (PostalCode = @origPostalCode OR @origPostalCode IS NULL AND PostalCode IS NULL);
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, City,
       PostalCode, Phone, Fax
FROM Customers WHERE (CustomerID = @currCustomerID)

Observe que os parâmetros instrução Set nove representam os valores atuais que serão gravados o banco de dados, enquanto os nove WHERE instrução parâmetros representam o original valores que são usados para localizar o registro original.

Nove primeiros parâmetros na instrução Set correspondem aos parâmetros nove primeiros na coleção de parâmetros.Esses parâmetros seriam ter sua propriedade SourceVersion definida como Current.

Os próxima nove parâmetros na instrução WHERE são usados para concorrência otimista.Esses espaços reservados corresponderia para os próxima nove parâmetros na coleção de parâmetros, e cada um desses parâmetros teria sua propriedade SourceVersion definida como Original.

O SELECT instrução é usada para atualizar o conjunto de dados após a atualização tenha ocorrido.Ele é gerado quando você definir a Atualizar o dataset Opção na Advanced SQL Generations caixa de diálogo Opções.

Observação:

A demonstrativo SQL acima usa parâmetros nomeados, enquanto OleDbDataAdapter comandos usam pontos de interrogação (?) sistema autônomo espaços reservados de parâmetro.

Por padrão Visual Studio cria esses parâmetros para se você selecionar simultaneidade otimista opção na caixa Assistente de Configuração de DataAdapter .Backup é que você adicione um código para manipular os erros com base em seus próprios requisitos comerciais.O ADO.NET fornece um objeto DBConcurrencyException que retorna a linha que viola as regras de simultaneidade.Para obter mais informações, consulte Como: Manipular erros de simultaneidade.

Consulte também

Tarefas

Como: Manipular erros de simultaneidade

Conceitos

Usando simultaneidade otimista

Referência

DBConcurrencyException