The world's most popular open source database
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.

