Tudo depende do
ISOLATION LEVEL
você definiu. Você pode ver qual você definiu com esta consulta:
select @@global.tx_isolation, @@session.tx_isolation;
Antes de explicar os diferentes níveis de isolamento, deixe-me explicar quais problemas eles estão tentando evitar:
-
A leitura suja :Os dados de uma transação ainda não finalizada são lidos por outra transação.
-
A atualização perdida :Duas transações modificam uma entrada em uma tabela em paralelo. Quando ambas as transações forem concluídas, apenas uma modificação será aplicada.
-
A leitura não repetível :leituras recorrentes levam a resultados diferentes.
-
A leitura fantasma :Durante uma transação, outra transação adiciona ou remove entradas de tabela.
Agora para os diferentes níveis de isolamento.
Ler não confirmado :
Com este nível de isolamento, as operações de leitura ignoram qualquer tipo de bloqueio, portanto, qualquer um dos problemas mencionados acima pode ocorrer.
Ler confirmado :
Este nível de isolamento define um bloqueio de gravação para toda a transação em objetos que devem ser modificados. Os bloqueios de leitura são definidos apenas durante a leitura de dados. Portanto, leitura não repetível e leitura fantasma podem ocorrer.
Leitura repetível :
Com este nível de isolamento é garantido que as operações de leitura recorrentes sempre produzem o mesmo resultado quando os parâmetros são os mesmos. Os bloqueios são definidos para operações de leitura e gravação durante a duração total da transação. Portanto, somente leituras fantasmas podem ocorrer.
Serializável :
O mais alto nível de isolamento garante que o resultado das transações paralelas seja o mesmo que se as transações estivessem sendo executadas uma após a outra. A maioria dos bancos de dados realmente não executa essas transações uma após a outra, seria uma perda de desempenho muito grande. Portanto, pode acontecer que uma transação seja abortada. O MySQL, por exemplo, realiza isso com o MVCC (Multi-Version Concurrency Control). Google-lo, se você quiser saber mais. É demais para esta resposta.
Em suma, esta tabela explica também:
| Lost updates | Dirty Read | Non-Repeatable Read | Phantom Read
---------------------------------------------------------------------------------
Read Uncommitted | possible | possible | possible | possible
Read Committed | impossible | impossible | possible | possible
Repeatable Read | impossible | impossible | impossible | possible
Serializable | impossible | impossible | impossible | impossible
- Nesta entrada manual é mais algumas informações sobre isso e como definir o nível de isolamento.
Tudo isso é apenas teoria para sistemas de gerenciamento de banco de dados relacional. Como o MySQL usa MVCC (controle de simultaneidade de várias versões), no entanto, leituras fantasmas não ocorrem ao usar InnoDB e nível de isolamento de leitura repetível .
Do manual :