mysql - update - tipos de bloqueo base de datos
MySQL-La tabla ''my_table'' no se bloqueó con las tablas de bloqueo (5)
La solución para mí fue desbloquear las mesas. Habían sido bloqueados por una consulta previa que falló antes de alcanzar la declaración de unlock tables
.
UNLOCK TABLES
SELECT ...
¿Intento cargar tablas a través de MySQL y aparece el siguiente error?
MySQL dijo: La tabla ''cms'' no estaba bloqueada con LOCK TABLES
¿Por qué es necesario bloquear la mesa? No he visto esto antes? ¿Hay alguna manera de desbloquear? ¿incluso quieres?
Me encontré con este problema:
LOCK TABLE <table_a> READ;
LOCK TABLE <table_b> READ;
LOCK TABLE <table_a> WRITE;
LOCK TABLE <table_b> WRITE;
luego leí, esto eleva la Table ''table_a'' was not locked with Lock Tables
.
Después de leer la documentation , arreglo el código de bloqueo a:
LOCK TABLE <table_a> WRITE, <table_b> WRITE
Esto resuelve el problema para mí.
LEER bloqueo de lectura, no se permiten escrituras
ESCRIBIR Exclusivo bloqueo de escritura. Ninguna otra conexión puede leer o escribir en esta tabla
O en una sesión, bloqueó una tabla pero desea seleccionar de otra tabla, debe bloquearla o desbloquear todas.
mysql> LOCK TABLES t1 READ;
mysql> SELECT COUNT(*) FROM t1;
+----------+
| COUNT(*) |
+----------+
| 3 |
+----------+
mysql> SELECT COUNT(*) FROM t2;
ERROR 1100 (HY000): Table ''t2'' was not locked with LOCK TABLES
Una de las líneas más importantes en la documentación de MySQL relacionada con el mensaje "Tabla ''tabla_mi'' no se ha bloqueado con las TABLAS DE BLOQUEO" es la siguiente:
"Mientras se mantienen los bloqueos así obtenidos, la sesión puede acceder solo a las tablas bloqueadas" https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
Esto significa que si intenta acceder a cualquier otra tabla en la base de datos mientras el BLOQUEO está en su lugar, aparecerá el mensaje de error "La tabla ''mi_tabla'' no se bloqueó con las TABLAS DE BLOQUEO"
La solución es aplicar el bloqueo a todas las tablas a las que desea tener acceso durante el bloqueo de esta manera. "BLOQUEAR TABLAS tabla_1 ESCRIBIR, tabla_2 ESCRIBIR"
Donde table_1 es el que realmente desea bloquear, pero también desea acceder a table_2 durante el mismo proceso.
Esto fue confuso porque estaba bloqueando solo la tabla_1 pero el mensaje de error me decía que la tabla ''tabla_2'' no estaba bloqueada con las TABLAS DE BLOQUEO
Me tomó un tiempo averiguar por qué table_2 estaba involucrado. Espero que esto ayude a alguien más con el mismo problema.
http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html
MySQL permite que las sesiones del cliente adquieran bloqueos de tablas explícitamente con el fin de cooperar con otras sesiones para acceder a las tablas, o para evitar que otras sesiones modifiquen las tablas durante los períodos en que una sesión requiere acceso exclusivo a ellas. Una sesión puede adquirir o liberar bloqueos solo para sí misma. Una sesión no puede adquirir bloqueos para otra sesión o liberar bloqueos mantenidos por otra sesión.
Los bloqueos se pueden utilizar para emular transacciones o para obtener más velocidad al actualizar las tablas. Esto se explica con más detalle más adelante en esta sección.
LOCK TABLES adquiere explícitamente los bloqueos de tabla para la sesión del cliente actual. Los bloqueos de tabla se pueden adquirir para tablas base o vistas. Debe tener el privilegio LOCK TABLES y el privilegio SELECT para que se bloquee cada objeto.
Para el bloqueo de vistas, LOCK TABLES agrega todas las tablas base utilizadas en la vista al conjunto de tablas que se deben bloquear y las bloquea automáticamente. Si bloquea una tabla explícitamente con BLOQUEO DE TABLAS, todas las tablas utilizadas en los desencadenantes también se bloquean implícitamente, como se describe en la Sección 13.3.5.2, “BLOQUEO DE TABLAS y disparadores”.
Las TABLAS DE DESBLOQUEO liberan explícitamente los bloqueos de tabla mantenidos por la sesión actual. BLOQUEO DE TABLAS libera implícitamente cualquier bloqueo de tabla mantenido por la sesión actual antes de adquirir nuevos bloqueos.
Otro uso de UNLOCK TABLES es liberar el bloqueo de lectura global adquirido con la instrucción FLUSH TABLES WITH READ LOCK, que le permite bloquear todas las tablas en todas las bases de datos. Consulte la Sección 13.7.6.3, “Sintaxis de FLUSH”. (Esta es una forma muy conveniente de obtener copias de seguridad si tiene un sistema de archivos como Veritas que puede tomar instantáneas a tiempo).
Sintaxis para BLOQUEO y DESBLOQUEO
LOCK TABLES
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE
P.ej:-
LOCK TABLE t WRITE, t AS t1 READ;
Desbloquear mesas
UNLOCK TABLES