[Tutorial] Bloqueo de tabla MySQL


En este tutorial, aprenderá a usar bloqueos MySQL para coordinar el acceso a la tabla entre sesiones.

MySQL permite que las sesiones del cliente adquieran bloqueos de tabla explícitamente para evitar que otras sesiones accedan a la tabla durante un período de tiempo específico. Las sesiones de cliente solo pueden adquirir o liberar bloqueos de tabla por sí mismas. No puede adquirir ni liberar bloqueos de tabla para otras sesiones.

Antes de la introducción detallada, crearemos una base de datos de muestra llamada sampledb, que contiene una tabla tbl simple para simular la declaración de bloqueo de la tabla de práctica.

CREAR BASE DE DATOS SI NO EXISTE testdb; USE testdb; CREATE TABLE tbl (id int (11) NOT NULL AUTO_INCREMENT, col int (11) NOT NULL, PRIMARY KEY (id)); 

Sintaxis de las tablas LOCK y UNLOCK

La forma simple de adquirir un candado de tabla es la siguiente:

LOCK TABLES nombre_tabla [LEER | ESCRIBIR] 

Puede poner el nombre de la tabla después de la palabra clave LOCK TABLES, seguida de un tipo de bloqueo. MySQL proporciona dos tipos de bloqueo: LEER y ESCRIBIR. Presentaremos estos dos tipos de bloqueo en detalle en la siguiente sección.

Para liberar el bloqueo de la mesa, use la siguiente declaración:

DESBLOQUEAR TABLAS; 

Tabla bloqueada como READ

El bloqueo READ de la tabla tiene las siguientes funciones:

Al mismo tiempo, el bloqueo READ de la tabla se puede adquirir a través de múltiples sesiones. Además, otras sesiones pueden leer datos de la tabla sin adquirir un bloqueo.

Una sesión con un bloqueo READ solo puede leer datos de la tabla, pero no puede escribir. Además, otras sesiones no pueden escribir datos en la tabla antes de liberar el bloqueo READ. Una operación de escritura de otra sesión se pondrá en estado de espera hasta que se libere el bloqueo READ.

Si la sesión termina de forma normal o anormal, MySQL liberará implícitamente todos los bloqueos. Esto también está relacionado con los bloqueos de ESCRITURA.

Echemos un vistazo a cómo funciona el bloqueo READ en las siguientes situaciones.

Primero, conéctese a la base de datos testdb. Para encontrar el ID de conexión actual, use la función CONNECTION_ID (), como se muestra a continuación:

mysql> SELECT CONNECTION_ID (); + ----------------- + | CONNECTION_ID () | + ----------------- + | 6 | + ----------------- + 1 fila en conjunto 

Luego, inserte uno en la tabla tbl.

INSERT INTO tbl (col) VALUES (10); 

A continuación, recupere todas las filas de la tabla anterior tbl.

mysql> SELECT * FROM tbl; + ---- + ----- + | id | col | + ---- + ----- + | 1 | 10 | + ---- + ----- + 1 fila en conjunto 

Después de eso, para adquirir el bloqueo, puede usar la instrucción LOCK TABLE. Finalmente, en la misma sesión, si intenta insertar una nueva fila en la tabla tbl, recibirá un mensaje de error.

mysql> LOCK TABLE tbl READ; Consulta OK, 0 filas afectadas mysql> INSERT INTO tbl (col) VALUES (11); 1099 - La tabla 'tbl' se bloqueó con un bloqueo READ y no se puede actualizar mysql> 

Entonces, una vez que se obtiene el bloqueo READ, los datos no se pueden escribir en la tabla en la misma sesión. Veamos el bloqueo READ de diferentes sesiones.

Primero, abra otra terminal y conéctese a la base de datos testdb, y luego verifique la ID de conexión:

mysql> SELECT CONNECTION_ID (); + ----------------- + | CONNECTION_ID () | + ----------------- + | 7 | + ----------------- + 1 fila en conjunto 

Luego, recupere los datos de tbl como se muestra a continuación:

mysql> SELECT * FROM tbl; + ---- + ----- + | id | col | + ---- + ----- + | 1 | 10 | + ---- + ----- + 1 fila en conjunto 

A continuación, inserte una nueva fila de la segunda sesión (ID de sesión 7) en la tabla tbl.

Bloqueo de tabla MySQL

La operación de inserción de la segunda sesión está en un estado de espera porque la primera sesión ha adquirido un bloqueo READ en la tabla tbl y aún no lo ha liberado.

Puede utilizar la instrucción SHOW PROCESSLIST para ver información detallada, como se muestra a continuación:

mysql> MOSTRAR LISTA DE PROCESOS; + ---- + ------ + ----------------- + ---------- + -------- - + ------ + --------------------------------- + ------- -------------------------- + | Id | Usuario | Anfitrión | db | Comando | Tiempo | Estado | Info | + ---- + ------ + ----------------- + ---------- + -------- - + ------ + --------------------------------- + ------- -------------------------- + | 2 | raíz | localhost: 51998 | NULL | Dormir | 474 | | NULL | | 3 | raíz | localhost: 51999 | yiibaidb | Dormir | 3633 | | NULL | | 6 | raíz | localhost: 52232 | testdb | Consulta | 0 | comenzando | MOSTRAR LISTA DE PROCESOS | | 7 | raíz | localhost: 53642 | testdb | Consulta | 110 | Esperando bloqueo de metadatos de la tabla | INSERT INTO tbl (col) VALUES (20) | + ---- + ------ + ----------------- + ---------- + -------- - + ------ + --------------------------------- + ------- -------------------------- + 4 filas en conjunto 

Después de eso, regrese a la primera sesión y use la instrucción UNLOCK TABLES para liberar el bloqueo. Después de liberar el bloqueo READ de la primera sesión, realice la operación INSERT en la segunda sesión.

Finalmente, verifique los datos en la tabla tbl para ver si la operación INSERT en la segunda sesión se ejecuta realmente.

mysql> SELECT * FROM tbl; + ---- + ----- + | id | col | + ---- + ----- + | 1 | 10 | | 2 | 20 | + ---- + ----- + 2 filas en conjunto 

ESCRIBA el bloqueo de la tabla MySQL

El bloqueo de mesa para WRITE tiene las siguientes funciones:

Solo la sesión que posee el bloqueo de tabla puede leer y escribir datos de la tabla.

Antes de liberar el bloqueo de ESCRITURA, otras sesiones no pueden leer ni escribir en la tabla.

Obtenga más información sobre el principio de funcionamiento de las cerraduras WRITE.

Primero, adquiera un bloqueo de ESCRITURA desde la primera sesión.

LOCK TABLE tbl WRITE; 

Luego, inserte una nueva fila en la tabla tbl.

INSERT INTO tbl (col) VALUES (11); 

No hay problema, la declaración anterior se puede ejecutar normalmente. A continuación, lea los datos de la tabla tbl.

mysql> SELECT * FROM tbl; + ---- + ----- + | id | col | + ---- + ----- + | 1 | 10 | | 2 | 20 | | 3 | 11 | + ---- + ----- + 3 filas en conjunto 

Después de eso, abra una segunda sesión conectada a MySQL e intente escribir y leer datos:

MySQL pone estas operaciones en estado de espera. Puede utilizar la instrucción SHOW PROCESSLIST para verla en la primera sesión.

mysql> MOSTRAR LISTA DE PROCESOS; + ---- + ------ + ----------------- + ---------- + -------- - + ------- + --------------------------------- + ------ --------------------------- + | Id | Usuario | Anfitrión | db | Comando | Tiempo | Estado | Info | + ---- + ------ + ----------------- + ---------- + -------- - + ------- + --------------------------------- + ------ --------------------------- + | 2 | raíz | localhost: 51998 | NULL | Dormir | 8477 | | NULL | | 3 | raíz | localhost: 51999 | yiibaidb | Dormir | 11636 | | NULL | | 8 | raíz | localhost: 54012 | testdb | Dormir | 119 | | NULL | | 9 | raíz | localhost: 54013 | testdb | Consulta | 0 | comenzando | MOSTRAR LISTA DE PROCESOS | | 10 | raíz | localhost: 54016 | testdb | Consulta | 49 | Esperando bloqueo de metadatos de la tabla | INSERT INTO tbl (col) VALUES (21) | + ---- + ------ + ----------------- + ---------- + -------- - + ------- + --------------------------------- + ------ --------------------------- + 5 filas en conjunto 

Finalmente, suelte el bloqueo de la primera sesión. Ejecute la siguiente declaración:

DESBLOQUEAR TABLAS; 

Después de ejecutar la declaración anterior, verá que se han ejecutado todas las operaciones pendientes en la segunda sesión.

SELECCIONAR * DE tbl; Consulta OK, 1 fila afectada + ---- + ----- + | id | col | + ---- + ----- + | 1 | 10 | | 2 | 20 | | 3 | 11 | | 4 | 21 | + ---- + ----- + 4 filas en conjunto 

En este tutorial, le mostramos cómo bloquear y desbloquear: operaciones READ y WRITE para coordinar el acceso a la tabla entre sesiones


 

Supongo que te gusta

Origin blog.csdn.net/weixin_45713725/article/details/114581117
Recomendado
Clasificación