Niveis de Isolamento – MySQL

Ola pessoal,

Daremos continuidade ao assunto de transação, porém agora falando dos níveis de isolamento e os possíveis problemas.

O padrão SQL define quatro níveis de isolamento de transação, com o intuito de evitar três fenomenos indesejados em transações simultaneas. Assumimos que um ambiente de produção pode ter várias transações simultâneas, no mínimo uma por sessão.

Com isso, é possível que ocorra a:

– Leitura suja: Suponhamos que a transação “A” modifique algum campo da tabela, porém que ainda não o tenha commitado. Se uma transação “B” efetua um select nesta campo e ve o valor modificado pela transação “A” sem ter o commit efetuado, essa é uma leitura suja.

Isso é um problema em ambientes de tomada de decisão, Relatórios entre outros, pois caso a transação “A” sofra um Rollback, a transação “B” não saberá disso e ja tera informado o valor “erroneo”.

Leitura não repetitiva: Ocorre quando um select(leitura) reproduz resultados diferentes quando ela é repetida posteriormente na mesma transação.

Exemplo: A transação “A” le o valor de um campo. Se outra transação “B” atualizar este valor e commita-lo no banco, caso a transação “A” volte a consultar o mesmo campo, ela trará o valor comitado pela transação “B”, ou seja, trata valores diferentes do mesmo campo na mesma transação executada.

Isso é grave caso você opte por alterar algum registro com a condição de um campo x, onde ele pode assumir um valor y em seguida.

Leitura Fantasma: Uma transação “A” pode ler um conjunto de linhas de uma tabela com base em alguma condição Where SQL. Suponhamos que a transação “B” insira uma nova linha que também satisfaz a clausula Where na tabela utilizada pela transação A. Se a transação “A” for repetida ela verá um fantasma, ou seja, uma linha que não existia na primeira leitura utilizando a clausula where.

Segue abaixo uma tabela com os 4 níveis de Isolamento Padrão SQL:

isolamento1

* Impossível ocorrer com o Engine InnoDB

Repeatable Read: Este nível garante que a mesma leitura de um dado através do SELECT se repita, tendo o mesmo resultado para diferentes execuções na mesma transação. Se neste nível a leitura não fosse repetida, ela estaria aberta a leitura fantasma, que acontece entre um select e outro caso ocorra uma atualização nos dados neste espaço de tempo, conforme vimos acima.

É impossível acontecer a leitura fantasma com este nível de bloqueio utilizando o Engine InnoDB, tanto é que o Repeatable Read é o nível de Isolamento Default do MySQL.

Read Commited: Permite que a transação leia manipule os dados já commitados por outras transações. Caso alguma transação tenha alterado algum dado porém sem efetuar um commit, estes não serão vistos.

Com este nível de isolamento, você evita as leituras sujas, porém esta aberto para as leituras fantasmas e a Leitura não repetitiva.

Read Uncommited: Este nível permite que uma transação possa ver e manipular valores não commitados por outras transações, ficando aberto para leituras sujas e Leitura não repetitiva, facilitando também casos de Leituras fantasmas.

Serializable: Semelhante ao Repeatable Read, porém com a restrição adicional de que as linhas selecionadas por uma transação não podem ser alteradas ou lidas por outra transação, até que a primeira transação seja concluida.

Logo este nível isola completamente uma transação da outra, onde a segunda transação aguarda a finalização da primeira, e assim por diante “uma de cada vez”, evitando os fenomenos indesejados.

Conforme foi citado acima, por default o MySQL trabalha com o nível de isolamento Repeatable Read, sendo possível a sua alteração.

Para consultar o nível atual na instância:

Para alterar o nível de isolamento na instância, você pode usar a opção –transaction-isolation com o comando mysqld, ou alterar diretamente no my.cnf:

Antes de transcrever este post, li e reli varias fontes sobre o assunto, e espero que o entendimento destes pontos fique claro para todos os leitores. Da mesma forma, disponibilizo as fontes utilizadas:

https://en.wikipedia.org/wiki/Isolation_(database_systems)

#http://pt.slideshare.net/Wagnerbianchi/7-my-sql-56-transacoes

http://pgdocptbr.sourceforge.net/pg80/transaction-iso.html#FTN.AEN18759

No próximo post, iremos tratar sobre os niveis de bloqueio & dead locks no MySQL.

É isso ai pessoal.

Dúvidas, criticas ou sugestões? Fiquem a vontade, todo retorno é construtivo 🙂

Jose Wilson

Deixe uma resposta