Share via


Simultaneidade otimista: Visão geral

O LINQ to SQL oferece suporte a controle de simultaneidade otimista. A tabela a seguir descreve os termos que se aplicam à simultaneidade otimista na documentação do LINQ to SQL:

Termos Descrição
simultaneidade A situação em que dois ou mais usuários tentarem ao mesmo tempo atualizar a mesma linha de base de dados.
Conflito de simultaneidade A situação em que dois ou mais usuários tentarem ao mesmo tempo enviar conflitar valores em uma ou mais colunas de uma linha.
controle de simultaneidade A técnica usada para resolver conflitos de simultaneidade.
controle de simultaneidade otimista A técnica que investiga primeiro se outras transações alterados valores em uma linha antes de permitir alterações para ser enviada.

Contraste com controle de simultaneidade pessimista, que bloqueia o registro para evitar conflitos de simultaneidade.

O controle otimista é chamado assim porque considera improvável as chances de uma transação interferir com outra.
resolução de conflitos O processo de atualizar um item conflitante ver o base de dados novamente e depois reconciliar diferenças.

Quando um objeto é atualizado, o rastreador de alteração o LINQ to SQL contém os seguintes dados:

– Os valores originalmente retirados do banco de dados e usados para verificação de atualização.
– Os novos valores do banco de dados da consulta subsequente.

Em seguida, o LINQ to SQL determina se o objeto está em conflito (isto é, se um ou mais de seus valores de membro foram alterados). Se o objeto estiver em conflito, na sequência, o LINQ to SQL determina quais de seus membros estão em conflito.

Qualquer conflito de membro que o LINQ to SQL descobrir é adicionado a uma lista de conflito.

No modelo de objeto do LINQ to SQL, um conflito de simultaneidade otimista ocorre quando ambas as seguintes condições forem verdadeiras:

  • Tentativas de cliente para enviar alterações para o base de dados.

  • Um ou mais valores de atualização- verificação foram atualizados na base de dados como o último de cliente os ler.

A resolução desse conflito inclui a descoberta de membros do objeto estão em conflito, e então decidir o que você deseja fazer sobre ele.

Observação

Somente os membros mapeados como Always ou WhenChanged participam de verificação de simultaneidade otimista. Nenhuma verificação é executada para Nevermarcado membros. Para obter mais informações, consulte UpdateCheck.

Exemplo

Por exemplo, o seguinte cenário, inicia User1 para preparar uma atualização ver o base de dados para uma linha. User1 recebe uma linha com valores de Alfreds, de Maria, e de vendas.

User1 deseja alterar o valor da coluna do gerenciador Alfred e o valor da coluna de departamento ao mercado. Antes que User1 pode enviar as alterações, Usuário2 alterações enviadas a base de dados. O valor da coluna assistente já foi alterado isso agora a Mary e o valor da coluna de departamento para atender.

Quando User1 agora tenta enviar alterações, o envio falha e de ChangeConflictException uma exceção é lançada. Este resultado ocorre porque os valores de base de dados para a coluna assistente e a coluna de departamento não são aqueles que foram esperadas. Os membros que representam as colunas do assistente e departamento estão em conflito. A tabela a seguir resume a situação.

Estado Gerente Assistente department
Estado original Alfreds Maria Sales
User1 Alfred Marketing
Usuário2 Mary Serviço

Você pode resolver conflitos como este de maneiras diferentes. Para mais informações, confira Como gerenciar conflitos de alteração.

Lista de verificação de detecção e de resolução de conflitos

Você pode detectar e resolver conflitos em qualquer nível de detalhe. Em um extremo, você pode resolver todos os conflitos em uma das três maneiras (consulte RefreshMode) sem consideração adicional. No extremo outro, você pode designar uma ação específica para cada tipo de conflito em cada membro em conflito.

Tipos LINQ to SQL que oferecem suporte a descoberta e a resolução de conflitos

Classes e recursos para dar suporte à resolução de conflitos em simultaneidade otimista no LINQ to SQL incluem os seguintes:

Confira também