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
