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.
Especifique ou revise opções em seu modelo de UpdateCheck objeto.
Para obter mais informações, consulte Como especificar quais membros são testados para conflitos de simultaneidade.
No bloco try/catch da sua chamada para SubmitChanges, especifique em que momento você deseja que as exceções sejam lançadas.
Para obter mais informações, consulte Como especificar quando exceções de simultaneidade são lançadas.
Determine a quantidade de detalhes de conflito que você deseja recuperar e inclua o código no seu bloco try/catch de acordo.
Para obter mais informações, consulte Como recuperar informações de conflito de entidade e Como recuperar informações de conflito de membro.
Inclua no seu
try
/catch
código como pretende resolver os vários conflitos que descobrir.Para obter mais informações, consulte Como resolver conflitos retendo valores de banco de dados, Como resolver conflitos substituindo valores de banco de dados e Como resolver conflitos mesclando com valores de banco de dados.
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: