Lockear un objeto

31/07/2009 - 20:15 por Diana Rios | Informe spam
Buenas tardes a todos.

Les cuento mi problema apelando a la experiencia de alguien que pudiera
guiarme:

tengo un servicio web Aap.Net en IIS 6, el cual recibe dos parámetros un ID
y una cantidad. El objetivo del WS es recibir el ID (cliente) y en funcion
de unos procesos internos restarle la cantidad de su cuenta. Lo que necesito
hacer es que si un mismo cliente ( por ende el mismo ID ) hace dos
peticiones en simultáneo, lockear primero una y luego procesar la otra para
no tener conflictos en el momento de restarle la cantidad a su cuenta.

Si no fui clara por favor avísenme.

Desde ya muy agradecida por la ayuda.
 

Leer las respuestas

#1 Alberto Poblacion
31/07/2009 - 20:27 | Informe spam
"Diana Rios" wrote in message
news:
tengo un servicio web Aap.Net en IIS 6, el cual recibe dos parámetros un
ID y una cantidad. El objetivo del WS es recibir el ID (cliente) y en
funcion de unos procesos internos restarle la cantidad de su cuenta. Lo
que necesito hacer es que si un mismo cliente ( por ende el mismo ID )
hace dos peticiones en simultáneo, lockear primero una y luego procesar la
otra para no tener conflictos en el momento de restarle la cantidad a su
cuenta.




Depende de cómo tengas implementados esos "procesos internos". Por
ejemplo, si esa cantidad que le restas de su cuenta está almacenada en un
registro de base de datos, entonces lo mejor es dejar que el bloqueo lo
ponga la propia base de datos. Para ello lo que tienes que hacer es iniciar
una transacción, leer el registro, restarle la cantidad, grabar el registro,
y confirmar la transacción. De esta forma, el propio servidor pone los
bloqueos necesarios e impide que otra llamada al mismo proceso modifique el
valor que estaba "a medio modificar".

Si tus datos no están en base de datos sino en algún tipo de contenedor
definido en tu código, tendrás que poner tus propios bloqueos, que
dependerán de la implementación del proceso. Podrías usar, por ejemplo, un
Mutex o un Semáforo, pero esto fallará si la aplicación ASP.Net alguna vez
se despliega en una granja de servidores. O podrías usar un Servicio Windows
que atienda las peticiones de cálculo en un solo hilo que reciba las
peticiones por medio de una cola de mensajes. O podrías usar COM+ (a través
de System.EnterpriseServices) y marcar el procedimiento con el atributo
"Synchronized" para que COM+ ponga automáticamente los bloqueos
correspondientes.

Como ves hay muchas posibilidades que podrían ser más o menos
interesantes dependiendo de las características de tu programa. Desde luego
el caso más simple es el primero, el de meter una Transacción sobre la base
de datos.

Preguntas similares