Compartilhar via


Concorrência Otimista: Visão Geral

O LINQ to SQL dá suporte ao 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
concorrência A situação em que dois ou mais usuários ao mesmo tempo tentam atualizar a mesma linha de banco de dados.
Conflito de concorrência A situação em que dois ou mais usuários ao mesmo tempo tentam enviar valores conflitantes para uma ou mais colunas de uma linha.
Controle de concorrência A técnica usada para resolver conflitos de concorrência.
controle de concorrência 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 atualização de um item conflitante consultando o banco de dados novamente e, em seguida, reconciliando diferenças.

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

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

LINQ to SQL determina se o objeto está em conflito (ou seja, se um ou mais de seus valores de membro foram alterados). Se o objeto estiver em conflito, LINQ to SQL determinará em seguida quais de seus membros estão em conflito.

Qualquer conflito de membros descoberto pelo LINQ to SQL é adicionado a uma lista de conflitos.

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

  • O cliente tenta enviar alterações ao banco de dados.

  • Um ou mais valores para verificação de atualizações foram atualizados no banco de dados desde a última vez que o cliente os leu.

A resolução desse conflito inclui descobrir quais membros do objeto estão em conflito e, em seguida, decidir o que você deseja fazer sobre ele.

Observação

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

Exemplo

Por exemplo, no cenário a seguir, o User1 começa a preparar uma atualização consultando o banco de dados para uma linha. User1 recebe uma linha com valores de Alfreds, Maria e Sales.

User1 deseja alterar o valor da coluna Manager para Alfred e o valor da coluna Departamento para Marketing. Antes que o User1 possa enviar essas alterações, o User2 enviou alterações ao banco de dados. O valor da coluna assistente já foi alterado isso agora a Mary e o valor da coluna de departamento para atender.

Quando o User1 tenta enviar alterações, o envio falha e uma ChangeConflictException exceção é gerada. Esse resultado ocorre porque os valores de banco de dados para a coluna Assistente e a coluna Departamento não são aqueles esperados. 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 Departamento
Estado original Alfreds Maria Vendas
Usuário1 Alfred Mercadologia
User2 Maria Serviço

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

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

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

Tipos LINQ to SQL que dão suporte à descoberta e resolução de conflitos

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

Consulte também