Ver Mensaje Individual
  #12 (permalink)  
Antiguo 18/10/2006, 05:44
minterior
 
Fecha de Ingreso: octubre-2006
Mensajes: 2
Antigüedad: 18 años, 1 mes
Puntos: 1
De acuerdo Solución: sincronización con semáforos

Buenas!
Justamente yo estaba buscando exactamente lo mismo que mape367.

El problema del stock es básicamente un problema de concurrencia, puesto que si dos personas han abierto la página con el stock disponible y sólo queda 1 unidad del producto, acabarás teniendo -1. O lo que es peor aún, que se descuadre el stock: si los dos leen el dato stock = 1, y los dos le restan 1, el resultado para los dos será 0, y en lugar de -1 (dos compras), tendremos 0!!

Creo que he encontrado una buena solución a un problema de concurrencia: utilizar semáforos (función de php sem_get() i derivadas). Consiste en reservar una zona de memoria de manera que todos los procesos que se ejecutan simultáneamente en el servidor (con las peticiones a través de los navegadores de los clientes) no puedan acceder a la vez a esa zona de la memoria sinó que lo hagan de forma sincronizada. Esto lo controla un semáforo que se encarga de parar a todos los procesos antes de que puedan acceder a la memoria, dejando entrar sólo a 1 (configurable en sem_get), y hasta que éste no ha salido no puede entrar el siguiente. Así aseguramos que en esa parte del código, el proceso se ejecuta sólo, y podrá leer -el stock-, modificarlo y guardarlo de nuevo en la base de datos. Así cuando entre el siguiente proceso a leer el stock, seguro que ese dato está bién, y nadie más lo modificará hasta que él termine.

Antes de hacer nada recomiendo la lectura de este breve documento:
www . malditainternet.com/node/93

Y posteriormente entrar ya en el manual de php:
php.net/manual/en/function.sem-get.php

Espero haber ayudado a alguien, aunque quizás he llegado tarde para mape367 (aunque más vale tarde que nunca xDD).

Saludos, minterior.