Partilhar via


Níveis de Isolamento de Transações (ODBC)

Os níveis de isolamento das transações são uma medida do sucesso do isolamento das transações. Em particular, os níveis de isolamento das transações 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 comprometidos. Por exemplo, suponha que a transação 1 atualiza uma linha. A Transação 2 lê a linha atualizada antes da transação 1 confirmar a atualização. Se a transação 1 reverter a alteração, a transação 2 terá dados lidos que são considerados nunca terem existido.

  • Leituras Não Repetíveis Uma leitura não repetível ocorre quando uma transação lê a mesma linha duas vezes, mas recebe dados diferentes a cada vez. Por exemplo, suponha que a transação 1 lê uma linha. A Transação 2 atualiza ou apaga essa linha de dados e confirma a atualização ou eliminação. Se a transação 1 reler a linha, recupera valores diferentes ou descobre que a linha foi eliminada.

  • Phantoms Um fantasma é uma linha que corresponde aos critérios de pesquisa, mas que inicialmente não é visível. Por exemplo, suponha que a transação 1 lê um conjunto de linhas que satisfazem alguns critérios de pesquisa. A Transação 2 gera uma nova linha (através de uma atualização ou de um insert) que corresponde aos critérios de pesquisa para a transação 1. Se a transação 1 reexecutar a instrução que lê as linhas, obtém um conjunto diferente de linhas.

Os quatro níveis de isolamento de transações (conforme definidos pelo SQL-92) são definidos em termos destes fenómenos. Na tabela seguinte, um "X" marca cada fenómeno que pode ocorrer.

Nível de isolamento de transações Leituras sujas Leituras não repetíveis Fantasmas
Leitura não comprometida X X X
Leia comprometido -- X X
Leitura repetível -- -- X
Serializável -- -- --

A tabela seguinte descreve formas simples como um SGBD pode implementar os níveis de isolamento das transações.

Importante

A maioria dos SGBD utiliza esquemas mais complexos do que estes para aumentar a concorrência. Estes exemplos são fornecidos apenas para fins ilustrativos. Em particular, o ODBC não prescreve como determinados SGBD isolam transações umas das outras.

Isolamento de transações Possível implementação
Leitura não comprometida As transações não estão isoladas umas das outras. Se o SGBD suportar outros níveis de isolamento de transações, qualquer mecanismo que utilize para implementar esses níveis será ignorado. Para que não afetem negativamente outras transações, as transações em execução ao nível de Leitura Não Confirmada geralmente são de apenas leitura.
Leia comprometido A transação espera até que as linhas bloqueadas por escrita por outras transações sejam desbloqueadas; Isto impede que leia quaisquer dados "sujos".

A transação mantém um bloqueio de leitura (se apenas ler a linha) ou bloqueio de escrita (se atualizar ou eliminar a linha) na linha atual para impedir que outras transações a atualizem ou apaguem. A transação liberta bloqueios de leitura quando sai da linha atual. Mantém bloqueios de escrita até ser confirmado ou revertido.
Leitura repetível A transação espera até que as linhas bloqueadas para escrita por outras transações sejam desbloqueadas; o que impede a leitura de quaisquer dados não validados.

A transação mantém bloqueios de leitura em todas as linhas que devolve à aplicação e bloqueios de escrita em todas as linhas que insere, atualiza ou elimina. Por exemplo, se a transação inclui a instrução SQL SELECT * FROM Orders, a transação irá bloquear a leitura das linhas à medida que a aplicação as obtém. Se a transação incluir a instrução SQL DELETE FROM Orders WHERE Status = 'CLOSED', a transação bloqueia linhas de escrita ao apagá-las.

Como outras transações não podem atualizar ou eliminar estas linhas, a transação atual evita quaisquer leituras não repetíveis. A transação liberta bloqueios quando é confirmada ou revertida.
Serializável A transação espera até que as linhas bloqueadas para escrita por outras transações sejam desbloqueadas; assim, impede-se que qualquer dado "sujo" seja lido.

A transação mantém um bloqueio de leitura (se apenas ler linhas) ou bloqueio de escrita (se conseguir atualizar ou eliminar linhas) no intervalo de linhas afetado. Por exemplo, se a transação incluir a instrução SQL SELECT * FROM Orders, o intervalo é toda a tabela de Ordens; a transação bloqueia a tabela e não permite a inserção de novas linhas. Se a transação incluir a instrução SQL DELETE FROM Orders WHERE Status = 'CLOSED', o intervalo é todas as linhas com um Status de "CLOSED"; a transação bloqueia por escrita todas as linhas da tabela de Pedidos com um Status de "CLOSED" e não permite que sejam inseridas ou atualizadas linhas de modo que a linha resultante tenha um Status de "CLOSED".

Como outras transações não conseguem atualizar ou eliminar as linhas do intervalo, a transação atual evita leituras não repetíveis. Como outras transações não conseguem inserir quaisquer linhas no intervalo, a transação atual evita fantasmas. A transação liberta o seu bloqueio quando é confirmada ou revertida.

É importante notar que o nível de isolamento da transação não afeta a capacidade da transação de ver as suas próprias alterações; As transações podem sempre ver quaisquer alterações que fizerem. Por exemplo, uma transação pode consistir em dois extratos UPDATE , o primeiro dos quais aumenta o salário de todos os colaboradores em 10 por cento e o segundo estabelece o salário de qualquer empregado acima de um valor máximo até esse valor. Isto tem sucesso como uma única transação apenas porque a segunda instrução UPDATE pode ver os resultados da primeira.