none
manejo de concurrencia, correlativo de factura

    General discussion

  • saludos 

    bueno mi problema es el siguiente, estoy creando un sistema de R/S (Requisiciones de servicio), en donde acceden varios usuarios y modulos para crear estas requisiciones, me encuentro con un problema de concurrencia , en que sentido , en el sentido de que como puedo manejar el problema de correlativos asignados a cada R/S sin que este mismo numero sea asociado a una R/S solicitada por ootro usuario en el mismo tiempo??? alguna idea como manejar este problema, en alguna parte lei que se hacia con una tabla llamada correlativos, pero me gustaria me orientaran un poco, y como poder  saber que ese numero no se asigno o no esta asignado a otro R/S. ya que el manejo de autonumericos puede provocar errores o perdida...


    Wednesday, June 13, 2012 2:15 PM

All replies

  • correlativos asignados a cada R/S sin que este mismo numero sea asociado a una R/S solicitada por ootro usuario en el mismo tiempo?

    no usas un id identity o sea autonumerico ? esto generaria el id cuando insertas

    o es que necesitas tener el numerio antes de insertar, porque podrias aplciar el mismo concepto de los boletas de factura

    o sea insertar datos minimos que generen el numero, si te equivocas o se anula es como anular una factura, se anula completa y se peirde el numero como si lo usaras en papel

    cuando el usaurio inicia una factura o recibo genera el numerio insertando el registro con datos basicos en la tabla y este queda en firme creado, para ese usuario

    luego lo completa y realiza con eso actualizacion del registro ,pero el numero yas e genero desde el principio

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Wednesday, June 13, 2012 2:56 PM
  • muchas gracias por tu ayuda leando, me sirve de mucho, la verdad si pienso utilizar autonumericos y que al momento de guardar la R/S el numero asociado sea entrgado por el sistema. pero me surge otra duda, es posible que a dos usuarios que guarden en el mismo instante el sistema se entrege el mismo id??(que es autonumerico?)..puede ocurrir una perdida de informacion??
    Wednesday, June 13, 2012 3:22 PM
  • Hola:
    Te tienes que crear una tabla como esta.
    CONTADOR
    ========
    [NUMERO] [int]

    Cada inicio de año, se pone el NUMERO=0
    Para asignar un numero consecutivo:
    1.- Abrir una transaccion
    2.- UPDATE CONTADOR Set NUMERO=NUMERO+1
    3.- Select NUMERO From CONTADOR.
    4.- Insertar registro en tabla FACTURA
    5.- Cerrar la transaccion

    P.D.
    Si modificas el NUMERO estando dentro de una transaccion,
    una vez que modifica un usuario, al segundo usuario no le va a dejar modificar
    hasta que el usuario 1 termine la transaccion.

    Espero que se entienda
    Un saludo desde Bilbo
    Carlos

    Thursday, June 14, 2012 8:57 AM
  • Tiene buena lógica lo que comenta Carlos Herrero. Pero tengo una pregunta, en el raro caso que coincidan los dos usuarios haciendo una factura al mismo tiempo, si el segundo trata de entrar a modificar le sale una excepción o solo se queda en pausa a esperar que el primero termine? Y luego hace la factura. haz hecho algunas pruebas? No hay que indicar ningún nivel de isolationlevel como repeatableread para bloquear el registro? Gracias a todos. Me gusto tu solución, se ve sencilla y parece que funciona.

    Better late than never...

    Thursday, August 15, 2013 4:57 AM
  • Hola Brontobyte22,

    Yo aquí te recomendaría usar un autonumérico. Este te asegura mediante bloqueos que el número que asigna a uno no se lo asigna a otro y de esta forma se te solucionaría el problema.

    De todas formas depende para qué lo quieras usar, si lo que quieres es hacer un número correlativo sin huecos o con huecos... entonces tendrás que ajustar el nivel de aislamiento para balancear bien los requisitos con el rendimiento.

    Si quieres que no puedan existir huecos tendrás que sacrificar rendimiento aislando con "Serializable Isolation Level" las consultas, mientras que si te da igual los huecos (también es muy poco usual que pase esto si no es que tienes una concurrencia brutal) puede valerte el "Snapshot Isolation Level".

    Aquí te paso un artículo donde se explica el aislamiento

    http://technet.microsoft.com/es-es/library/ms173763.aspx

    Saludos y espero haberte ayudado


    @XaviPaper
    http://geeks.ms/blogs/xavipaper

    Thursday, August 15, 2013 9:16 AM
  • Hola:

    Si el usuario1 esta grabando la factura (ya ha iniciado la transacción1) y el usuario quiere iniciar la transacción2, esta se quedara esperando hasta que se termine la transacción1; una vez que la transaccion1 ha terminado , se inicia la transaccion2.

    Hice una prueba con 2 usuarios grabando cada uno 2000 registros y salio perfecta

    Un saludo desde Bilbo

    Carlos


    Friday, August 16, 2013 9:14 AM
  • Hola:

    En el supuesto que sean facturas, cada año se inicializan a 1; es decir cada año el numero de factura empieza por 1.

    ¿Cómo harias si el campo numero es autonumerico para que cada año empiece por el numero 1?

    Un saludo desde Bilbo

    Carlos

    Friday, August 16, 2013 9:18 AM