Noções básicas sobre níveis de isolamento

Baixar Driver JDBC

As transações especificam um nível de isolamento que define como uma transação é isolada das outras transações. Isolamento é a separação das modificações de recursos ou de dados feitas por transações diferentes. Os níveis de isolamento são descritos em termos de quais efeitos colaterais de simultaneidade são permitidos, como leituras sujas ou leituras fantasma.

Os níveis de isolamento da transação controlam os seguintes efeitos:

  • Se são feitos bloqueios quando os dados são lidos, e que tipo de bloqueio é solicitado.

  • Por quanto tempo os bloqueios de leitura são mantidos.

  • Se uma linha de referência de operação de leitura foi modificada por outra transação:

    • É bloqueada até que o bloqueio exclusivo na linha é liberado.

    • Recupera a versão confirmada da linha que existia no momento em que a instrução ou transação foi iniciada.

    • Lê a modificação de dados não confirmada.

Como escolher um nível de isolamento

A escolha de um nível de isolamento de transação não afeta os bloqueios adquiridos para proteger as modificações de dados. Uma transação sempre obtém um bloqueio exclusivo em todos os dados modificados. A transação mantém esse bloqueio até que seja concluída, independentemente do nível de isolamento definido para ela. Para operações de leitura, os níveis de isolamento da transação definem principalmente como a operação é protegida contra os efeitos de outras transações.

Um nível de isolamento baixo aumenta a capacidade de vários usuários acessarem dados ao mesmo tempo. Mas aumenta o número de efeitos de simultaneidade, como leituras sujas ou perda de atualizações, que podem ocorrer para os usuários. Por outro lado, um nível de isolamento maior reduz os tipos de efeitos de simultaneidade que podem ocorrer para os usuários. Mas exige mais recursos do sistema e aumenta as chances de que uma transação bloqueie outra. Escolher o nível de isolamento apropriado depende de equilibrar os requisitos de integridade de dados do aplicativo em relação à sobrecarga de cada nível de isolamento.

O nível de isolamento mais alto e serializável garante que uma transação recupere exatamente os mesmos dados sempre que repete a operação. Mas usa um nível de bloqueio com probabilidade de afetar outros usuários em sistemas de vários usuários. O nível de isolamento mais baixo, leitura não confirmada, pode recuperar dados que foram modificados mas não confirmados por outras transações. Todos os efeitos colaterais da simultaneidade podem ocorrer na leitura não confirmada, mas não há nenhum bloqueio de leitura nem controle de versão, portanto, a sobrecarga é minimizada.

Comentários

A tabela a seguir mostra os efeitos colaterais da simultaneidade permitidos pelos diferentes níveis de isolamento.

Nível de Isolamento Leitura suja Leitura não repetível Fantasma
Leitura não confirmada Sim Sim Sim
Leitura confirmada Não Sim Sim
Leitura repetida Não Não Sim
Instantâneo Não Não Não
Serializável Não Não Não

As transações precisam ser executadas em um nível de isolamento de, pelo menos, leitura repetida para evitar a perda de atualizações que pode ocorrer quando duas transações recuperam a mesma linha. Depois, a transação atualiza a linha com base nos valores recuperados originalmente. Se as duas transações atualizarem as linhas usando uma única instrução UPDATE e não basearem a atualização nos valores previamente recuperados, as atualizações perdidas não poderão ocorrer no nível de isolamento padrão de leitura confirmada.

Para definir o nível de isolamento de uma transação, você pode usar o método setTransactionIsolation da classe SQLServerConnection. Esse método aceita um valor int como seu argumento, que tem como base uma das constantes de conexão como no exemplo a seguir:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

Para usar o novo nível de isolamento de instantâneo do SQL Server, você pode usar uma das constantes SQLServerConnection:

con.setTransactionIsolation(SQLServerConnection.TRANSACTION_SNAPSHOT);

ou pode usar:

con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED + 4094);

Para obter mais informações sobre os níveis de isolamento do SQL Server, veja "Níveis de isolamento no Mecanismo de Banco de Dados" nos Manuais Online do SQL Server.

Confira também

Executando transações com o JDBC Driver
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)