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.
