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.

Preguntas similare

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.
Respuesta Responder a este mensaje
#2 Diana Rios
02/08/2009 - 16:16 | Informe spam
Alberto, muchas gracias por tu respuesta.

Éstos datos no están en un DB, por lo que me inclino en utilizar, tal como
planteas, un servicios Windows. Mi pregunta es: cómo hago para que el
servicio funcione en un solo hilo y no en varios ?

Muy agradecida por tu ayuda.



"Alberto Poblacion"
escribió en el mensaje news:%
"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.

Respuesta Responder a este mensaje
#3 Alberto Poblacion
02/08/2009 - 21:51 | Informe spam
"Diana Rios" wrote in message
news:
Éstos datos no están en un DB, por lo que me inclino en utilizar, tal como
planteas, un servicios Windows. Mi pregunta es: cómo hago para que el
servicio funcione en un solo hilo y no en varios ?



Si el servicio lo escribes con .Net, usando la plantilla que viene con
Visual Studio, básicamente tendrás un método "OnStart" que es el que inicia
el servicio. Este método debe terminar deprisa, para que no dé un error el
inicio del servicio. Lo que se hace normalmente es que en este método se
crean el hilo o los hilos que vayan a hacer el trabajo del servicio.
En tu caso, como solo quieres un único hilo, basta con que en el
OnStart crees un Thread y lo pongas en marcha, y a continuación el OnStart
termine. En la rutina del thread símplemente tendrías un bucle infinito que
lea un mensaje de la cola y lo procese, y cuando acabe de procesarlo vuelva
a leer el siguiente mensaje, y así sucesivamente.
La cola la podrías crear con MSMQ, que tiene su propia clase para
manejarlo desde .Net, con lo que el programa quedaría muy simple. Y tiene la
ventaja de que, si se configura adecuadamente, puede funcionar a través de
la red, con lo que podrías tener, por ejemplo, varios servidores web en una
granja, todos ellos enviando peticiones a través de la cola a un único
servidor rodando tu servicio, el cual procesaría secuencialmente desde su
único hilo todas las peticiones.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida