Suponiendo que se está ejecutando en el nivel de aislamiento
predeterminado REPEATABLE READ
, cuando se
realiza una lectura consistente -esto es, una sentencia
SELECT
ordinaria-, InnoDB
le otorga a la transacción un punto en el tiempo (timepoint)
del momento en que se realizó la consulta. Si otra transacción
elimina una fila y confirma la acción en un momento posterior a
dicho punto, no se verá la fila como borrada. Las inserciones y
actualizaciones se tratan del mismo modo.
Se puede obtener un timepoint más reciente confirmando la
transacción actual y emitiendo un nuevo
SELECT
.
Esto se llama control de concurrencia multiversión.
Usuario A Usuario B SET AUTOCOMMIT=0; SET AUTOCOMMIT=0; tiempo | 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 | --------------------- 1 row in set
En este ejemplo, el usuario A podrá ver la fila insertada por B solamente cuando B haya confirmado la inserción y A haya confirmado también, de modo que su timepoint avance e incluya la inserción confirmada por B.
Si se desea ver el “más reciente” estado de la
base de datos, se debería emplear ya sea el nivel de
aislamiento READ COMMITTED
o bien una lectura
con bloqueo:
SELECT * FROM t LOCK IN SHARE MODE;
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.