Estoy continuando el proyecto de PHP con mysql de final de curso de este modulo para ponerlo en internet, pero tengo un grave problema al que no encuentro solucion:
Tengo una tabla eventos(campos id, tipoEvento, dato1, dato2, etc). Cada vez que un usuario lleva a cabo ciertas acciones en la aplicacion, se leen todos los registros con fecha INFERIOR a la actual(eventos que deberian haber ocurrido). Con los datos de cada fila obtenida, segun el tipo de evento, se llama a una funcion u otra que realiza distintas tareas sobre otros registros del resto de la base de datos. Una vez realizado el cambio, se comprueba que ha sido exitoso y se elimina la fila del evento recien procesado. Si no, se hace un rollback y se almacena el error en la tabla "errores".
Por ejemplo, podria haber un evento que indicase sumar 5 unidades de X producto en la tabla productos. El problema es, ¿Y si dos usuarios leen a la vez los mismos eventos, antes de que ninguna fila sea procesada y eliminada?
En este caso, se procesaria dos veces el evento(sumando dos veces las 5 unidades), aunque en una de ellas daria error al eliminarlo, asi que igual esto se podria utilizar para detectarl y hacer un rollback(tras derrochar un tiempo haciendo las mismas modificaciones para nada).
Pero hay otro problema, y es que es importantisimo que los eventos se procesen por orden de fecha. Lo que no ha de pasar es que dos usuarios lean dos eventos distintos pero que afecten, por ejemplo, al campo "cantidad" de la tabla productos. Supongamos que el primer evento quedebe ser procesado tarda 3 segundos en hacer calculos y actualizar la tabla, pero el segundo tarda 0.1 segundos en hacer todo. Seria como si procesara primero uno y luego el otro :S
Lo unico que se me ocurre es ir bloqueando campos nada mas leer el evento con select for update, y si al final se ve que el evento no se puede eliminar porque ya ha sido procesado unos milisegundos antes, hacer un rollback completo...
¿Alguna sugerencia?
No se si habra algun modo de bloqueo(para la tabla eventos) que cuando haces una consulta, no devuelva los datos hasta que todas las filas a mostrar hayan sido desbloqueadas(o eliminadas). Quiero decir, que si haces un select con bloqueo a unas determinadas filas(con campos varchar que empiecen por A, por ejemplo), luego al hacer un select a esa tabla(de las filas con campos varchar igual a "Antiguo") se quede esperando hasta que todas ls filas sean liberadas.
PD: EL proyecto no consiste en nada relacionado con productos ni almacenes ni tiendas, era por poner un ejemplo sencillo.