Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os níveis de isolamento da transação são uma medida da extensão em que o isolamento da transação é bem-sucedido. Em particular, os níveis de isolamento da transação são definidos pela presença ou ausência dos seguintes fenômenos:
Leituras Sujas Uma leitura suja ocorre quando uma transação lê dados que ainda não foram confirmados. Por exemplo, suponha que a transação 1 atualize uma linha. A Transação 2 lê a linha atualizada antes que a transação 1 confirme a atualização. Se a transação 1 reverter a alteração, a transação 2 terá dados de leitura considerados nunca existidos.
Leituras não executáveis Uma leitura não legível ocorre quando uma transação lê a mesma linha duas vezes, mas obtém dados diferentes a cada vez. Por exemplo, suponha que a transação 1 leia uma linha. A Transação 2 atualiza ou exclui essa linha e confirma a atualização ou exclusão. Se a transação 1 relê a linha, ela recupera valores de linha diferentes ou descobre que a linha foi excluída.
Fantasmas Um fantasma é uma linha que corresponde aos critérios de pesquisa, mas não é vista inicialmente. Por exemplo, suponha que a transação 1 leia um conjunto de linhas que atendam a alguns critérios de pesquisa. A transação 2 gera uma nova linha (por meio de uma atualização ou uma inserção) que corresponde aos critérios de pesquisa da transação 1. Se a transação 1 reexecutar a instrução que lê as linhas, ela obterá um conjunto diferente de linhas.
Os quatro níveis de isolamento de transação (conforme definido pelo SQL-92) são definidos em termos desses fenômenos. Na tabela a seguir, um "X" marca cada fenômeno que pode ocorrer.
| Nível de isolamento da transação | Leituras sujas | Leituras não repetíveis | Fantasmas |
|---|---|---|---|
| Leitura não confirmada | X | X | X |
| Leitura confirmada | -- | X | X |
| Leitura repetida | -- | -- | X |
| Serializável | -- | -- | -- |
A tabela a seguir descreve maneiras simples de um DBMS implementar os níveis de isolamento da transação.
Importante
A maioria dos DBMSs usa esquemas mais complexos do que esses para aumentar a simultaneidade. Esses exemplos são fornecidos apenas para fins ilustrativos. Em particular, o ODBC não prescreve como DBMSs específicos isolam transações umas das outras.
| Isolamento de transações | Implementação possível |
|---|---|
| Leitura não confirmada | As transações não são isoladas umas das outras. Se o DBMS der suporte a outros níveis de isolamento de transação, ele ignorará qualquer mecanismo usado para implementar esses níveis. Para que elas não afetem negativamente outras transações, as transações em execução no nível Read Uncommitted geralmente são de leitura apenas. |
| Leitura confirmada | A transação aguarda até que as linhas bloqueadas por outras transações sejam desbloqueadas; isso impede que ele leia os dados "sujos". A transação mantém um bloqueio de leitura (se apenas lê a linha) ou um bloqueio de gravação (se atualiza ou deleta a linha) na linha atual para impedir que outras transações a atualizem ou deletem. A transação libera bloqueios de leitura quando sai da linha atual. Ele mantém bloqueios de escrita até ser confirmado ou revertido. |
| Leitura repetida | A transação aguarda até que as linhas bloqueadas por outras transações sejam desbloqueadas; isso impede que ele leia os dados "sujos". A transação mantém bloqueios de leitura em todas as linhas que retorna ao aplicativo e bloqueios de escrita em todas as linhas que insere, atualiza ou exclui. Por exemplo, se a transação incluir a instrução SQL SELECT * FROM Orders, a transação bloqueará as linhas conforme o aplicativo as busca. Se a transação incluir a instrução SQL DELETE FROM Orders WHERE Status = 'CLOSED', a transação aplica bloqueios de escrita nas linhas à medida que as exclui. Como outras transações não podem atualizar ou excluir essas linhas, a transação atual evita qualquer leitura não repetível. A transação libera seus bloqueios quando é confirmada ou revertida. |
| Serializável | A transação aguarda até que as linhas bloqueadas por outras transações sejam desbloqueadas; isso impede que ele leia os dados "sujos". A transação mantém um bloqueio de leitura (se ela lê apenas linhas) ou um bloqueio de gravação (se puder atualizar ou excluir linhas) no intervalo das linhas que ela afeta. Por exemplo, se a transação incluir a instrução SQL SELECT * FROM Orders, o intervalo será toda a tabela Pedidos; a transação bloqueia a tabela e não permite que novas linhas sejam inseridas nela. Se a transação incluir a instrução SQL DELETE FROM Orders WHERE Status = 'CLOSED', o intervalo inclui todas as linhas com status 'CLOSED'; a transação bloqueia todas as linhas na tabela Orders com status 'CLOSED' e não permite que nenhuma linha seja inserida ou atualizada de forma que a linha resultante tenha status 'CLOSED'. Como outras transações não podem atualizar ou excluir as linhas no intervalo, a transação atual evita qualquer leitura não repetível. Como outras transações não podem inserir quaisquer linhas no intervalo, a transação atual previne fantasmas. A transação libera seu bloqueio quando é confirmada ou revertida. |
É importante observar que o nível de isolamento da transação não afeta a capacidade de uma transação de ver suas próprias alterações; as transações sempre podem ver as alterações feitas. Por exemplo, uma transação pode consistir em duas instruções UPDATE, sendo que a primeira aumenta o salário de todos os funcionários em 10% e a segunda define o salário de qualquer funcionário acima de um determinado valor máximo para esse valor. O sucesso como uma única transação ocorre apenas porque a segunda instrução UPDATE pode ver os resultados da primeira.