domingo, 25 de enero de 2015

Bloqueo e Interbloqueo en MySql

¿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!