Hola Vera828,
Voy a asumir que estás usando bases de datos, que es la forma más simple de solucionar tu problema.
Antes que nada, siempre deberías comprobar que queden lugares.
Me imagino que tu situación es así
- queda 1 lugar.
- usuario 1 y usuario 2 entran a ver los detalles del taller, a ambos se les muestra que queda 1 lugar.
Lo que deberías hacer es indicar que los datos mostrados pueden no ser los actuales, el usuario debería saber eso de antemano.
Luego, creo que la solución es bastante simple: en el momento en el que el usuario intenta subscribirse, comprobás de nuevo si hay lugares.
Si hay cupos, seguís con la inscripción, si no hay, le mostrás al usuario que no hay lugar.
Dada la velocidad a la que se ejecutan estos procesos, la comprobación y la inserción serán casi instantáneas. Una petición posterior entrará a la comprobación de nuevo, y verá el resultado terminado.
Si aún te preocupa que puedan coincidir (una preocupación completamente válida) lo que deberías hacer es usar transacciones en tu base de datos.
Es decir, hacer que la comprobación y la inserción sean 1 sola consulta.
Me imagino algo como
BEGIN
comprobar()
SI QUEDAN CUPOS
inscribir()
COMMIT
Lo bueno de hacer esto es que ambas consultas se ejecutarán como 1 sola, bloqueando el acceso a la fila: una segunda comprobación inmediatamente luego de la primera, pero antes de la inserción, tendrá que esperar a que la inserción termine.
Me permito recomendarte algo muy básico que escribí sobre el tema:
Transacciones en MySQL
Otro problema diferente se daría si en vez de usar bases de datos estás usando archivos de texto, en ese caso deberías hacer algo similar a lo que estás haciendo, creo que una buena forma sería:
crear el archivo de bloqueo
consultar si quedan cupos
si quedan inscribir
borrar el archivo de bloqueo.
Si una consulta entra y el archivo de bloqueo existe, lo que podrías hacer es obtener el número de cupos disponibles, pero no hacer nada, y simplemente mostrar un texto tipo "Otra inscripción está en curso, nos quedan X lugares. Intenta nuevamente en unos segundos"
Espero haberme explicado bien.
Saludos.