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:
SELECT * FROM t LOCK IN SHARE MODE;
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.