Um Exemplo de Como a Leitura Consistente Funciona no InnoDB
Suponha que você esteja utilizando o nível de isolamento padrão REPEATABLE READ
. Quando você executa uma leitura consistente, isto é, uma instrução SELECT
comum, o InnoDB
dará a sua transação um ponto no tempo de acordo com o que a sua consulta viu no banco de dados Assim, se a transação B deleta uma linha e faz um commit depois que o ponto no tempo foi atribuido, então você não verá a linha deletada. Inserções e atualização são feitos de forma parecida.
Você pode avançar o seu ponto no tempo fazendo um commit da transação e fazendo outro SELECT
.
Isto é chamado controle de concorrência multi-version.
User A User B SET AUTOCOMMIT=0; SET AUTOCOMMIT=0; time | SELECT * FROM t; | empty set | INSERT INTO t VALUES (1, 2); | v SELECT * FROM t; empty set COMMIT; SELECT * FROM t; empty set; COMMIT; SELECT * FROM t; --------------------- | 1 | 2 | ---------------------
Assima o usuário A vê a linha inserida por B apenas quando B fizer um commit da inserção e A tiver feito um commit de sua própria transação pois assim o ponto no tempo é avançado para depois do commit de B.
Se você deseja ver o estado mais atual do banco de dados, você deve utilizar uma trava de leitura: