none
Consulta sobre aplicación en varias pc's y sus consultas sql. RRS feed

  • Pregunta

  • Hola, les escribo porque necesito su ayuda con unas dudas que tengo...
    Quizás ésta pregunta esté en el foro incorrecto ya que no se si es una consulta de sql o de windows forms...
    Paso a explicar, hay en producción una aplicación la cual se utiliza en 30 máquinas supongamos. Hay un procedimiento que se está efectuando en las 30 máquinas a la vez que es una consulta de inserción en una tabla T1 y que luego debe seleccionar el último id generado por esa tabla T1 e insertar miles de registros en una tabla T2 con ese id. El tema es éste.. al efectuarse en 30 pc's a la vez las consultas, yo estoy obteniendo el SCOPE_IDENTITY() en la misma consulta de inserción de la tabla T1, por lo que obtengo el último id, pero lo que no se es como funciona ésto en las 30 máquinas... corro el riezgo de obtener en una máquina el id generado por otra máquina? Cabe aclarar que esta inserción está dentro de una transacción.

    Espero me puedan responder, gracias y disculpen si esta pregunta se encuentra en el foro equivocado.
    jueves, 22 de octubre de 2009 13:09

Todas las respuestas

  • hola

    Si asi es si las transacciones entre estas pcs es continua seguramente te presentes con este problema.

    La solucion seria que no pre-generes el id de la entidad para mostrarselo al usuario
    Sino que lo hagas en el mismo momento que insertas la entidad, y una vez en la db entonces si le retornas al usuario que id se le asigno.


    Esta es una tecnica, pero si necesitas que si o si este el id previo (cuadno solo se selecciona nueva transaccion), lo que deberias hacer es generar la entidad con datos minimos o por defecto, o sea ese insert te asegura que la id ya esta resevada para ese usuario, solo queda que las posteriores acciones seran todas actualziaciones (update).
    Esto ultimo tiene sus contras, por ejemplo que apsa si cancela la accion el suaurio, en ese caso deberas elimianr el registro, y esto seguro genere huecos en la secuancialidad de los id de la tabla.


    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 22 de octubre de 2009 13:25
  • Espero me disculpes Leandro, pero no entendí lo que me dijiste.. yo creo que se entendió mal la pregunta y el problema...

    Pongo la situación.. el método que efectua las consultas comienza una transacción, luego inserta UN solo registro en la tabla T1 llamado de_id por ejemplo y en ésta misma consulta de inserción está el SELECT SCOPE_IDENTITY(), es decir algo como "...New SqlCommand('INSERT INTO T1(....); SELECT SCOPE_IDENTITY;', "CADENA DE CONEXION").." y esto lo obtengo con un executeEscalar() que me estaría devolviendo el último de_id generado por T1, luego con ese de_id, se insertan mediante un foreach, miles de registros en la tabla T2, es decir de_id sería una clave foranea. Y finalmente hago un commit de la transacción.

    La duda que me surge es que pasa si ésto se efectúa en mas de una pc.. el SCOPE_IDENTITY me asegurará que me devuelve el último de_id generado para esa consulta?

    Gracias por responder.
    jueves, 22 de octubre de 2009 13:39
  • Para estar seguro puedes empezar la consulta haciendo un bloqueo de tabla, y luego la desbloqueas al terminar el ingreso, pero la manera que trabajas no debería generar problemas.
    jueves, 22 de octubre de 2009 15:55
  • hola

    Exacto el Identity se esta devolviendo el id del ultimo registro insertado en esa operacion.

    SCOPE_IDENTITY (Transact-SQL)

    asi que el efecto que quieres lograr se cumple sin problemas.

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 22 de octubre de 2009 17:01
  • Muchas gracias por responder, voy a aplicar eso que digo entonces.
    jueves, 22 de octubre de 2009 18:05
  • hola


    me pareció que tener presente las diferentes alternativas para recuperar el IDENTITY podria ser de utilidad

    como veras el SCOPE_IDENTITY recupera el id generado por por conexion y declaracion, por lo cual te aseguras que sera el id generado por el INSERT que esta en ese mismo bloque, no se podria confundir y devolverte el generado por otra transacción de otra pc aunque estas se ejecuten de casualidad en paralelo

    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 23 de octubre de 2009 1:17
  • Si la consulta del id esta dentro de la misma transaccion le bloque de la tabla se mantendra hasta que se termine la transaccion en el pero de los casos puedes caer en un dead lokc.

    Pero creo que este tema deberias llevarlo a los foros de sql

    lunes, 5 de diciembre de 2011 1:35