sql >> Base de Datos >  >> RDS >> Mysql

mysql - ¿Bloquear filas para la consulta de selección?

El bloqueo nativo de MySQL no proporciona esta funcionalidad. Podría usar una columna para realizar sus "bloqueos".

Suponiendo que cada subproceso tuviera una ID única, podría crear una columna llamada thread_owner , con valor predeterminado 0.

Un hilo tomaría una fila como esta:

UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1

Luego, seleccione la fila como esta (es posible que no devuelva ninguna, si no hubiera filas para procesar):

SELECT *
FROM mytable
WHERE thread_owner = :my_threadID

Luego procéselo y finalmente elimínelo.

Esta solución funcionaría tanto en MyISAM como en InnoDB.

Sin embargo, para InnoDB, puede ser lento porque cada declaración de ACTUALIZACIÓN intenta bloquear todas las filas donde thread_owner =0 y, a menos que esté seguro de que está bloqueando todas las filas en el mismo orden cada vez, incluso podría causar un interbloqueo. Por lo tanto, puede intentar bloquear explícitamente toda la tabla en su instrucción UPDATE:

LOCK TABLES mytable WRITE;
UPDATE mytable
SET thread_owner = :my_threadID
WHERE thread_owner = 0
LIMIT 1;
UNLOCK TABLES;

De esa forma, tanto MyISAM como InnoDB funcionarán de la misma manera.