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.
Especificar ou revise as opções de UpdateCheck no seu modelo de objeto.
Para mais informações, veja Como: Especificar quais membros são testados para conflitos de simultaneidade.
Em bloco try/catch de sua chamada a SubmitChanges, especifique ponto em que você deseja exceções seja lançada.
Para obter mais informações, consulte Como especificar quando exceções de simultaneidade são lançadas.
Determine quanto detalhes de conflito você deseja recuperar, e inclua código em seus bloco try/catch de acordo.
Para obter mais informações, consulte Como recuperar informações de conflito de entidades e Como recuperar informações de conflito de membros.
Inclua no seu código
try
/catch
como você deseja resolver os conflitos mais que você descobrir.Para obter mais informações, consulte Como resolver conflitos retendo valores do banco de dados, Como resolver conflitos substituindo valores do banco de dados e Como resolver conflitos mesclando os valores com os valores do banco de dados.
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: