Hola Javier.

 

Todo depende en la capa que lo quieras solucionar.

Según decís lo estás tratando de solucionar a nivel datos.

Podrías hacerlo con algún trigger, o en la estructura del mismo query de
inserción haciendo un INSERT condicionado a que un SELECT COUNT de los
artículos de mayor que cero.

 

De todas maneras, me parece que sería más lógico solucionarlo a nivel
negocio (aparte estás escribiendo en la lista “puntonet”, eso quiere decir
que en tu subconsciente me das la razón ;-)

Fijate que se trata de una restricción del negocio, no de integridad de
datos. Podría ocurrir que a algún tipo de usuario especial le permitas
ingresar pedidos aunque no haya disponibilidad avisándole que quedará a la
espera de reposición de stock. Ya te estás metiendo bien en el dominio del
problema. Eso no es un tema de la base de datos.

 

Lo que yo haría es chequear la existencia de artículos en tu regla de
negocios.

Cuando se desencadena el pedido de un usuario la regla de negocios primero
verifica si existen artículos disponibles.

Ahí te está quedando la incertidumbre de concurrencia durante unos pocos
nanosegundos entre que la regla de negocios chequea en la base si hay
artículos y hace la inserción.

 

Para hacerlo más seguro, usaría un singleton de bloqueo de artículos.

La clase ControladorArticulos tendría un método function
BloquearArticulo(pArtCodigo) as boolean que devolvería true si bloqueó
exitosamente y false sino (por ejemplo, si el artículo ya se encontraba
bloqueado por otro usuario).

 

Entonces en la regla de negocios te quedaría (en un pseudo, apurado y no
refactorizado VB.NET)

 

Dim mBloqueado as boolean = false

 

Do while not mBloqueado

   If ControladorArticulos.GetInstance.BloquearArticulo(pCodigoArt) then
‘INTENTAS BLOQUEAR EL ARTICULO

            mBloqueado = true

            Dim mArt as new Articulo(pCodigoArt)

If mArt.Saldo > 0 then

               InsertarPedido(XXXX, Articulo, usuario, etc etc) ‘ACA SE
INSERTA EL PEDIDO

            Else

               GestionarElmensajeParaPresentarAlusuario(“Sorry, no hay
stock”)

            End if    

   End if

Loop

   ControladorArticulos.GetInstance.DesbloquearArticulo(pCodigoArt)

 

De esta forma te aseguras que se chequea disponibilidad e inserta el pedido
de a un usuario por vez.

 

Espero te sirva

Saludos 

Leonardo

 

  _____  

De: MYMTEC S.A. - Javier Wamba [mailto:[EMAIL PROTECTED] 
Enviado el: Martes, 13 de Febrero de 2007 11:12 a.m.
Para: [email protected]
Asunto: [puntonet] Concurrencia en DB

 

* Replies will be sent through Spamex to [email protected] 
* For additional info click -> www.spamex.com/i/?v=13137989 

 

Buenas,

Tengo el siguiente problema, tal vez alguien me pueda ayudar.

Tengo una aplicacion ASP.net 2.0 y necesito insertar registros en la base de
datos solo si hay saldo al momento de la insercion.

El tema es asi, tengo una tablas donde se guarda el total que hay de cada
articulo y tengo otra tabla donde se guarda el consumo de dichos articulos,
en un momento dado yo le muestro al usuario los articulos que tiene
disponibles y su saldo para la oparacion que quiere realizar, pero, cuando
el usuario elija el articulo a utilizar y complete la cantidad a consumir
puede que el saldo que le mostraba ya no sea real, es decir, otro usuario de
otra terminal consumio de ese articulo y lo dejo con menos saldo. Entonces
lo que nesecito es preguntar antes de escribir, pero preguntar no en la
aplicacion sino en la base de datos bloqueando la tabla para que entre la
pregunta y el insert no pase nada. 

¿que tecnicas se utilizan para esto o como se hace?

El bloqueo de tablas no me sirve porque si se desconectan queda bloqueada la
tabla.

Le comunico que trabajo con MySQL igual imagino que un ejenplo con SQLServer
me sirve tambien y sino yo me  encargo de adaptarlo.

Cualquier pregunta o aclaracion sobre el contenido de este correo pregunten
tranquilos

 

Muchisimas gracias.

 

Javier Wamba

 

 

 

Responder a