Primero: MySQL es una de las peores piezas de software posibles para implementar esto, especialmente si es muy dinámico. La razón es que los motores como MEMORY y MyISAM solo tienen bloqueos de tabla completa, mientras que los motores más adecuados como InnoDB tienen una penalización de escritura más alta (para proporcionar propiedades ACID) y están optimizados para acceder a registros que están cercanos espacial y temporalmente (se configuran en la memoria ) Tampoco existe un buen sistema de notificación de cambios para MySQL; debe implementarse como una encuesta. Hay docenas de piezas de software más optimizadas para esa tarea .
Dicho esto, he visto implementar con éxito este tipo de acceso si los requisitos de rendimiento / eficiencia no son muy altos. Muchas personas no pueden permitirse el lujo de introducir y mantener una pieza de tecnología completamente separada solo por una pequeña parte de la lógica empresarial.
SELECT FOR UPDATE
es lo que está buscando: lea la serialización. Si bien una ACTUALIZACIÓN / BORRAR siempre bloqueará la fila durante una transacción MYSQL en ejecución, es posible que desee evitar una transacción grande mientras el proceso continúa, por lo tanto:
START TRANSACTION;
SELECT * FROM your_table WHERE state != 'PROCESSING'
ORDER BY date_added ASC LIMIT 1 FOR UPDATE;
if (rows_selected = 0) { //finished processing the queue, abort}
else {
UPDATE your_table WHERE id = $row.id SET state = 'PROCESSING'
COMMIT;
// row is processed here, outside of the transaction, and it can take as much time as we want
// once we finish:
DELETE FROM your_table WHERE id = $row.id and state = 'PROCESSING' LIMIT 1;
}
MySQL se encargará de bloquear todas las selecciones simultáneas excepto una al seleccionar filas. Como esto puede conducir a muchas conexiones bloqueadas al mismo tiempo, mantenga la transacción inicial lo más pequeña posible e intente procesar más de 1 fila a la vez.