Efeitos de simultaneidade

Os usuários que modificam dados podem afetar outros usuários que estejam lendo ou modificando os mesmos dados ao mesmo tempo. Dizemos que esses usuários estão acessando os dados simultaneamente. Se um sistema de armazenamento de dados não tiver nenhum controle de simultaneidade, os usuários verão os seguintes efeitos colaterais:

  • Atualizações perdidas

  • Dependência não confirmada (leitura suja)

  • Análise inconsistente (leitura não-repetível)

  • Leituras fantasma

  • Leituras ausentes e duplicadas provocadas por atualizações de linha

Atualizações perdidas

As atualizações perdidas acontecem quando duas ou mais transações selecionam a mesma linha e então atualizam a linha com base no valor selecionado originalmente. Cada transação não tem conhecimento das outras transações. A última atualização substitui atualizações feitas pelas outras transações, o que resulta em dados perdidos.

Por exemplo, dois editores fazem uma cópia eletrônica do mesmo documento. Cada editor altera a cópia de maneira independentemente e salva a cópia alterada, substituindo, portanto, o documento original. O editor que salva a cópia alterada por último substitui as alterações feitas pelo outro editor. Esse problema poderia ser evitado se um editor não pudesse acessar o arquivo até que o outro editor tivesse terminado e confirmado a transação.

Dependência não confirmada (leitura suja)

A dependência não confirmada acontece quando uma segunda transação seleciona uma linha que está sendo atualizada por outra transação. A segunda transação está lendo dados que não foram confirmados ainda e podem ser alterados pela transação que atualiza a linha.

Por exemplo, um editor está fazendo mudanças em um documento eletrônico. Durante as mudanças, um segundo editor pega uma cópia do documento que inclui todas as mudanças feitas até o momento e distribui o documento para a audiência destinada. O primeiro editor decide então que as mudanças feitas até o momento estão erradas, remove as edições e salva o documento. O documento distribuído contém edições que já não existem e que deveriam ser tratadas como se nunca tivessem existido. Esse problema poderia ser evitado se ninguém pudesse ler o documento alterado até que o primeiro editor salvasse a versão final com as modificações e confirmasse a transação.

Análise inconsistente (leitura não-repetível)

Ocorre análise inconsistente quando uma segunda transação acessa a mesma linha várias vezes e lê dados diferentes a cada vez. A análise inconsistente é semelhante à dependência não confirmada, no sentido em que outra transação está alterando os dados que uma segunda transação está lendo. No entanto, na análise inconsistente os dados lidos pela segunda transação foram confirmados pela transação que fez as alterações. Além disso, a análise inconsistente envolve leituras múltiplas (duas ou mais) da mesma fila, e a cada vez as informações são alterada por outra transação; daí a denominação leitura não-repetível.

Por exemplo, um editor lê o mesmo documento duas vezes, mas entre cada leitura o escritor reescreve o documento. Quando o editor lê o documento pela segunda vez, este já foi alterado. A leitura original não era repetível. Esse problema poderia ser evitado se o escritor não pudesse alterar o documento até que o editor tivesse terminado de lê-lo pela última vez.

Leituras fantasma

Leituras fantasma acontecem quando uma ação de inserção ou exclusão é executada em uma linha que pertence a um intervalo de linhas que estão sendo lidas por uma transação. A primeira leitura do intervalo de linhas da transação mostra uma linha que já não existe mais na segunda leitura ou leitura posterior, como resultado de uma exclusão por uma transação diferente. De maneira semelhante, a segunda leitura ou leitura posterior da transação mostra uma linha que não existia na leitura original, como resultado de uma inserção por uma transação diferente.

Por exemplo, um editor faz alterações em um documento enviado por um escritor, mas quando as alterações são incorporadas na cópia mestra do documento pelo departamento de produção, descobre-se que material novo não editado foi acrescentado ao documento pelo autor. De modo semelhante à situação de leitura não-repetível, esse problema poderia ser evitado se ninguém pudesse acrescentar material novo ao documento até o editor e o departamento de produção terminarem de trabalhar com o documento original.

Leituras ausentes e duplicadas provocadas por atualizações de linha

  • Perdendo uma fila atualizada ou vendo uma linha atualizada múltiplas vezes

    Transações que estejam sendo executadas no nível READ UNCOMMITTED não emitem bloqueios compartilhados para impedir que outras transações modifiquem os dados lidos pela transação atual. Transações que estejam sendo executadas no nível READ COMMITTED emitem bloqueios compartilhados, mas os bloqueios de linha ou de página são liberados depois que a linha é lida. Em qualquer dos dois casos, quando você estiver percorrendo um índice, se outro usuário alterar a coluna de chave de índice da linha durante sua leitura, a linha poderia aparecer novamente se a alteração de chave movesse a linha para uma posição à frente de sua leitura. De maneira semelhante, a linha poderia não aparecer se a alteração de chave movesse a linha para uma posição no índice que você já tinha lido. Para evitar isto, use a dica SERIALIZABLE ou HOLDLOCK ou controle de versão de linha. Para obter mais informações, consulte Dicas de tabela (Transact-SQL) e Níveis de isolamento com base no controle de versão de linha no Mecanismo de Banco de Dados.

  • Perdendo uma ou mais linhas que não eram o destino da atualização

    Quando você estiver usando READ UNCOMMITTED, se sua consulta ler linhas que usem uma varredura de ordem de alocação (usando páginas IAM), você poderá perder linhas se outra transação estiver provocando uma divisão de página. Isso não pode acontecer quando você estiver usando leitura confirmada, porque um bloqueio de tabela é mantido durante uma divisão de página, e não ocorre se a tabela não tiver um índice clusterizado, porque as atualizações não provocam divisões de página.