Que seria exactamente esto:

ControladorArticulos.GetInstance

no logro entender como lo bloqueo desde negocios. Muy por arriba creo entender 
que lo que estas proponiendo es un objeto que utilizen todos los usuarios para 
hacer esto.
¿Me lo podrias explicar con un poquito mas de detalle?

Muchas gracias

Javier


  ----- Original Message ----- 
  From: [EMAIL PROTECTED] 
  To: [email protected] 
  Sent: Tuesday, February 13, 2007 12:08 PM
  Subject: [puntonet] Concurrencia en DB


  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