Supposons que vous exécutez MySQL avec le niveau d'isolation
des transactions de REPEATABLE READ
. Lorsque
vous demandez une lecture cohérente avec une commande
SELECT
ordinaire, InnoDB
va donner à votre transaction une date jalon, en fonction de
laquelle votre requête va voir la base. Ainsi, si une
transaction B efface une ligne après l'assignation de ce jalon,
vous ne verrez pas cette ligne. De même pour une insertion ou
une modification.
Vous pouvez faire avancer votre date jalon en validant votre
transaction et en exécutant un autre SELECT
.
Cela s'appelle le contrôle simultané multi-versions.
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 | ---------------------
De cette fa¸on, A voir la ligne insérée par B uniquement lorsque B a validé son insertion, et que A a validé sa propre transaction, de fa¸on à ce que la date jalon soit plus récente que la validation de B.
Si vous voulez avoir une vision aussi ``fraîche'' que possible de votre base, vous devez utiliser le verrou en lecture :
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.