MySQL motor de almacenamiento InnoDB bloqueos de lectura y escritura, bloqueos a nivel de fila

Bloqueo de lectura y escritura

motor de almacenamiento InnoDB de MySQL en el tratamiento de lectura o de escritura simultánea, para resolver problemas de concurrencia de dos tipos de cerraduras, dos cierres son generalmente llamados bloqueos compartidos y bloqueos exclusivos, también conocidas como cerraduras de lectura y escritura.

Leer cierre es compartida, es decir, varios clientes pueden leer el mismo recurso al mismo tiempo.

bloqueo de escritura es exclusivo, lo que significa que bloqueos de escritura bloquean otros bloqueos de escritura y bloqueos de lectura.

Por ejemplo:

Una operación de lectura de la necesidad del cliente no esperar a la finalización de la lectura del cliente B y libera el bloqueo. Pero el cliente A al intentar escribir, bloqueará otros clientes lean y operaciones de escritura hasta que la operación de escritura Un cliente para completar y liberar el bloqueo, otros clientes pueden leer y escribir.

Se dice mucho, pero en realidad cuando el cliente A para actualizar una fila de registro al mismo tiempo, el cliente B pueden leer datos de cualquier supuesto, no se bloquearán, esta es la razón?

El primero en saber dos cosas, Redo Log (registros de rehacer) y Deshacer Log (registro de rollback)

por lo general rehacer registro de registro de registro físico es la página física para modificar los datos, que se utiliza para restaurar la página física después de la presentación de los datos (página de datos restaurada, y sólo puede ser restaurado a la posición de la última confirmación).
registro de deshacer para volver a rodar una versión de la línea. generalmente deshacer registro registros lógicos grabados de acuerdo con cada línea de grabación.

Si usted no entiende, por lo que la comprensión: se produce cuando una operación de escritura, InnoDB los viejos datos almacenados en el registro de deshacer (rollback registro), los nuevos datos se escriben en Redo Log (registros de rehacer) en.

Cuando el cliente A para actualizar una fila de registro al mismo tiempo, el cliente B será bloqueado bloqueos de escritura, el tiempo, el cliente B irá a deshacer Entre para leer los datos antiguos.

la práctica Vamos a la siguiente.

CREATE TABLE `test001` (
  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` char(50) DEFAULT NULL,
  `last_name` char(50) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `test001`(`id`, `first_name`, `last_name`) VALUES (1, 'fn001', 'ln001');
INSERT INTO `test001`(`id`, `first_name`, `last_name`) VALUES (2, 'fn002', 'ln002');
INSERT INTO `test001`(`id`, `first_name`, `last_name`) VALUES (3, 'fn003', 'ln003');

Ejecutado en un terminal

EMPEZAR;
ACTUALIZACIÓN test001 SET nombre apellido = 'Update_Name' DONDE apellidos = 'ln001';

Otra realiza terminales

SELECT * FROM `test001` DONDE apellidos = 'ln001';

Consultas todavía puede obtener los datos

PD: Después de finalizada la prueba, recuerda a cometer o extremos de transacción reversión.

el bloqueo de filas

Innodb bloqueo de filas, pero esto hace innodb fila no significa solamente locked modificado. Tenga en cuenta las siguientes operaciones.

Realizar un terminal de conexión

EMPEZAR;
ACTUALIZACIÓN test001 SET nombre apellido = 'Update_Name' DONDE apellidos = 'ln001';

En otra ejecución la conexión del terminal

EMPEZAR;
ACTUALIZACIÓN test001 SET nombre apellido = 'update_name2222' DONDE apellidos = 'ln002';

 

Segundo tiempo de espera de SQL se bloquea, es decir, no actualización bloqueado = last_name 'ln001' líneas, otras líneas también se bloquean. En este caso, de hecho, se nos quedaron toda la tabla.

Rollback por encima de las cosas, entonces las siguientes operaciones. Ejecutar rollback

¿Por qué decir implementos InnoDB fila nivel de bloqueo es? Vamos a añadir una línea con el índice de apellidos.

Sólo hay que ejecutar de nuevo la sentencia

 

Dos de no interferencia instrucción de actualización puede verse, el índice puede ser visto a través de Innodb proyectó fuera last_name = línea de datos 'ln001', y luego '= last_name única ln001' línea de datos, bloqueo de la otra línea de datos no es está bloqueado, por lo que en este caso se pueden actualizar 'ln002' líneas de datos = last_name.

No se pre-indexados, InnoDB no sería capaz de especificar el filtro cabo filas de datos a través de índices, sólo para bloquear toda la tabla.

 

Publicado 51 artículos originales · elogios ganado 14 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/u010606397/article/details/93975909
Recomendado
Clasificación