¿Qué es el modo bloqueo?
El modo bloqueo permite impedir el
acceso o modificación a una tabla o una fila por otra solicitud, hasta que la
tarea actual haya terminado. Cuando la tarea actual haya terminado, se
continuará con la siguiente. Para habilitar el modo de bloqueo, debe usarse el
engine InnoDB.
El modo de bloqueo puede ser:
● Compartido:
Se permite la lectura, pero no la modificación.
●
Exclusivo:
No se permite leer ni modificar.
InnoDB permite además granularidad múltiple.Esto quiere
decir, que podrá realizarse al mismo tiempo un bloque en un registro, y una
tabla entera. Para ello se hace uso de tipos adicionales de bloqueos, como los bloqueos de intención, los cuales
pueden ser de:
●
Intención
compartida: se hace un bloqueo compartido en tuplas individuales.
●
Intención
exclusiva: se hace un bloqueo de exclusivo en las tuplas.
.Un ejemplo de un bloqueo sería lo
siguiente:
LOCK TABLES real_table WRITE, insert_table
WRITE;
INSERT INTO real_table SELECT * FROM
insert_table;
TRUNCATE TABLE insert_table;
UNLOCK TABLES;
¿Qué es un interbloqueo?
Los interbloqueos son un problema
derivado en el uso de bloqueos, el cual provoca que 2 o más consultas no puedan
llegar nunca a completarse. Los interbloqueos son debidos a un mal uso de los
bloqueos, y se produce cuando una consulta
A depende de que una consulta B
haya finalizado, y esta consulta B
depende de que la consulta A haya finalizado. un ejemplo en la vida real de
este problema, sería el de 2 personas que desean ir de viaje a un lugar en
coche, uno con la gasolina y otro con el coche, pero ninguno quiere ceder en
dejar lo que necesita el otro. El resultado será que ninguno de los dos irá de
viaje.
Existen diferentes técnicas de
resolver los interbloqueos en InnoDB. Algunas de ellas son:
●
Usar SHOW
INNODB STATUS para determinar la causa del último deadlock. Puede ayudar
a afinar la aplicación para evitar que ocurran nuevos bloqueos.
●
Preparar la aplicación para que vuelva a realizar una
solicitud si la anterior no se pudo completar.
●
Confirmar frecuentemente que las transacciones se han
realizado correctamente.
●
Si se están usando lecturas que establecen bloqueos (SELECT ... FOR UPDATE o ... LOCK IN SHARE MODE), hay que
intentar utilizar un nivel de aislamiento bajo, como READ COMMITTED.
●
Acceder a las tablas y filas en un orden fijo.
Entonces, las transacciones forman secuencias bien definidas y no originan
deadlocks.
●
Agregar a las tablas índices bien elegidos. Entonces
las consultas necesitarán examinar menos registros de índice y por tanto
establecerán menos bloqueos. Utiliza EXPLAIN
SELECT para conocer los índices recomendados por MySQL.
●
Utilizar menos bloqueos. Utilizar READ COMMITTED para un SELECT ya debería ser seguro,
porque cada lectura consistente dentro de la misma transacción leerá de su
propia captura más reciente.
●
si aun así continúan los problemas, las transacciones
de bloqueos podrían realizarse a nivel de tabla. La forma correcta de emplear LOCK TABLES con tablas
transaccionales, como InnoDB, es establecer AUTOCOMMIT = 0 y no invocar a UNLOCK TABLES hasta que se haya
confirmado explícitamente la transacción.
●
Otra manera de serializar transacciones es crear una
tabla “semáforo” auxiliar que contenga solo una fila. Hay que hacer que cada
transacción actualice esa fila antes de acceder otras tablas. De ese modo,
todas las transacciones se producirán en serie.
●
En aquellas aplicaciones que emplean el comando de
MySQL LOCK TABLES, MySQL no
establece bloqueos de tabla s AUTOCOMMIT=1.
No hay comentarios:
Publicar un comentario
¡Danos tu opinión!