Níveis de isolamento da transação (ODBC)
Os níveis de isolamento da transação são uma medida da extensão em que o isolamento de transação é bem-sucedido. Em particular, os níveis de isolamento da transação são definidos pela presença ou pela 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 de a transação 1 confirmar a atualização. Se a transação 1 reverter a alteração, a transação 2 terá dados de leitura que serão considerados como nunca tendo existido.
Leituras não repetíveis Uma leitura não repetível ocorre quando uma transação lê a mesma linha duas vezes, mas obtém dados diferentes a cada vez. Por exemplo, considere que a transação 1 atualize uma linha. A transação 2 atualiza ou exclui essa linha e confirma a atualização ou a exclusão. Se a transação 1 reler a linha, ela recuperará valores de linha diferentes ou descobrirá 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 cumpram alguns critérios de pesquisa. A transação 2 gerará uma nova linha (por meio de uma atualização ou inserção) que corresponde aos critérios de pesquisa da transação 1. Se a transação 1 executar novamente a instrução que lê as linhas, ela obterá um conjunto diferente de linhas.
Os quatro níveis de isolamento da transação (conforme definição do SQL-92) são estabelecidos em termos desses fenômenos. Na tabela a seguir, um "X" marca cada fenômeno possível.
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 repetível | -- | -- | 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 apresentados apenas para fins ilustrativos. Em particular, o ODBC não prescreve como determinados DBMSs isolam transações umas das outras.
Isolamento de transação | Possível implementação |
---|---|
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 executadas no nível Leitura não confirmada geralmente são somente leitura. |
Leitura confirmada | A transação aguarda até as linhas bloqueadas por outras transações serem desbloqueadas. Isso impede que ela leia qualquer dado "sujo". A transação mantém um bloqueio de leitura (se apenas lê a linha) ou um bloqueio de gravação (se atualiza ou exclui a linha) na linha atual para impedir que outras transações a atualizem ou excluam. A transação libera bloqueios de leitura quando sai da linha atual. Ela mantém bloqueios de gravação até a confirmação ou a reversão. |
Leitura repetível | A transação aguarda até o desbloqueio das linhas bloqueadas por outras transações. Isso impede que ela leia qualquer dado "sujo". A transação mantém bloqueios de leitura em todas as linhas que retorna ao aplicativo e cria um bloqueio de gravação 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 criará um bloqueio de leitura nas linhas à medida que o aplicativo efetuar fetch delas. Se a transação incluir a instrução SQL DELETE FROM Orders WHERE Status = 'CLOSED', a transação criará um bloqueio de gravação nas linhas à medida que as excluir. Como outras transações não podem atualizar nem excluir as linhas no intervalo, a transação atual evita qualquer leitura não repetível. A transação libera os bloqueios quando ela é confirmada ou revertida. |
Serializável | A transação aguarda até o desbloqueio das linhas bloqueadas por outras transações. Isso impede que ela leia qualquer dado "sujo". A transação mantém um bloqueio de leitura (se só lê linhas) ou um bloqueio de gravação (se pode atualizar ou excluir linhas) no intervalo de linhas que ela afeta. Por exemplo, se a transação incluir a instrução SQL SELECT * FROM Orders, o intervalo será toda a tabela Orders, a transação criará um bloqueio de leitura na tabela e não permitirá que novas linhas sejam inseridas nela. Se a transação incluir a instrução SQL DELETE FROM Orders WHERE Status = 'CLOSED', o intervalo incluirá todas as linhas com um Status de "CLOSED", a transação criará um bloqueio de gravação em todas as linhas na tabela Orders com um Status de "CLOSED" e não permitirá que nenhuma linha seja inserida ou atualizada, de modo que a linha resultante terá um Status de "CLOSED". Como outras transações não podem atualizar nem excluir as linhas no intervalo, a transação atual evita leituras não repetíveis. Como outras transações não podem inserir linhas no intervalo, a transação atual evita qualquer fantasma. A transação libera seu bloqueio quando ela é 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 todas as alterações que fizerem. Por exemplo, uma transação pode consistir em duas declaraçõ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 todos os funcionários acima de algum valor máximo para aquele valor. Isso é bem-sucedido como uma transação única apenas porque a segunda declaração UPDATE pode ver os resultados da primeira.