Partilhar via


Simultaneidade otimista: Visão geral

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

Termos Description
simultaneidade A situação em que dois ou mais usuários ao mesmo tempo tentam atualizar a mesma linha de banco de dados.
conflito de simultaneidade 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 simultaneidade A técnica usada para resolver conflitos de simultaneidade.
controle de simultaneidade otimista A técnica que primeiro investiga se outras transações alteraram valores em uma linha antes de permitir que as alterações sejam enviadas.

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

O controle otimista é assim denominado porque considera improváveis as chances de uma transação interferir em outra.
Resolução de conflitos O processo de atualizar um item conflitante consultando o banco de dados novamente e, em seguida, reconciliando diferenças.

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

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

Em seguida, o 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, o LINQ to SQL determinará em seguida quais de seus membros estão em conflito.

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

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

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

  • Um ou mais valores de verificação de atualização foram atualizados no banco de dados desde a última leitura feita pelo cliente.

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

Nota

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

Exemplo

Por exemplo, no cenário a seguir, 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 Gerente para Alfred e o valor da coluna Departamento para Marketing. Antes de User1 poder enviar essas alterações, User2 enviou alterações para o banco de dados. Assim, agora o valor da coluna Assistente foi alterado para Maria e o valor da coluna Departamento para Serviço.

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

Estado Gestor Assistente Departamento
Estado original Alfredos Márcia Sales
Utilizador1 Alfredo Marketing
Utilizador2 Mary Serviço

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

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

Você pode detetar e resolver conflitos em qualquer nível de detalhe. Em um extremo, você pode resolver todos os conflitos de uma das três maneiras (ver 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 de LINQ to SQL que oferecem suporte à descoberta e resolução de conflitos

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

Consulte também