Blog de Gonzalo

BLOQUEO DE TABLAS

MySQL permite bloquear tablas para que diversas queries puedan ejecutarse al mismo tiempo sin distorsionar sus resultados. Este bloqueo puede ser de escritura o de lectura. Después de realizar el bloqueo hay que realizar un desbloqueo, como es lógico.
Para usar LOCK TABLES en MySQL se necesita el privilegio global LOCK TABLES y el privilegio SELECT en las tablas involucradas.
Ahora voy a poner la sintaxis para cada tipo de bloqueo:

  • Bloqueo por escritura:LOCK TABLES WRITE
    LOCK TABLES tbl_contador WRITE;
    UPDATE tbl_contador SET valor = valor + 1; //incrementar el contador
    SELECT valor FROM contador; //retornar el contador asignado
    UNLOCK TABLES;
  • Bloqueo por lectura:LOCK TABLES READ
    LOCK TABLES trans READ;
    SELECT SUM(value) FROM trans WHERE customer_id=some_id;
    UPDATE customer SET total_value=sum_from_previous_statement
    WHERE customer_id=some_id;
    UNLOCK TABLES;
El bloqueo WRITE tiene mayor prioridad que el bloqueo READ, para asegurar que las actualizaciones se procesan lo antes como sea posible. Esto significa que si un hilo obtiene un bloqueo READ y después otro hilo realiza un bloqueo WRITE,las siguientes peticiones de bloqueos READ no se ejecutarán hasta que el hilo que solicitó el bloqueo WRITE lo libere. Se puede usar el bloqueo LOW_PRIORITY WRITE para que otros hilos `puedan realizar bloqueos READ mientras el hilo espera al bloqueo WRITE.
Sólo se debe usar el bloqueo LOW_PRIORITY WRITE si se está seguro de que existirá un tiempo en el que no habrá hilos que pidan un bloqueo READ.

Compartir en twitter