none
Cómo resolver una concurrencia en SQL ? RRS feed

  • Pregunta

  • Quisiera saber cómo resolver una concurrencia o colisión cuando dos o más usuarios ingresan a una misma tabla en el mismo momento. Pregunto: SQL lo resuelve por sí mismo, o es necesario configurarlo de alguna forma ?

    Desde ya agradezco la atención

    Lic. Osvaldo Torchia Estrada

    sábado, 16 de junio de 2018 3:04

Respuestas

  • Hola LenCom:

    La pregunta que planteas es muy complicada. Depende

    Sql server nos da herramientas para que nosotros resolvamos esas opciones con las propias configuraciones de las que dispone. Te pongo un ejemplo.

    Si la tabla tiene una clave Identity, y entran dos operaciones en la misma unidad de tiempo, el resuelve encolando las dos peticiones, cuando ha resuelto la inserccion de un registro, luego inserta el otro, y no se produce la colisión.

    Sin embargo si la clave primaria no es identity, si ocurre una colisión, y el error.

    Las sentencias update por si mismas, resuelven el problema, quiero decir, que no entran en conflicto, porque si entran las dos a la vez, una se ejecuta primero, y hasta que no terminado la otra no se ejecuta porque el registro esta bloquedo por la primera. Pero el resultado, es que si no esta bien programado, si cambias el valor de la misma fila, al final, la concurrencia hará que el valor que quede registrado es el de la sentencia que entro en segundo lugar.

    En definitivas cuentas, que para salvar los problemas de concurrencia, hace falta trabajo y un buen diseño de base de datos. Si el diseño no es tan bueno, entonces, hace falta mucho trabajo.

    Espero haberme explicado bien.

    Un saludo


    sábado, 16 de junio de 2018 5:44

Todas las respuestas

  • Hola LenCom:

    La pregunta que planteas es muy complicada. Depende

    Sql server nos da herramientas para que nosotros resolvamos esas opciones con las propias configuraciones de las que dispone. Te pongo un ejemplo.

    Si la tabla tiene una clave Identity, y entran dos operaciones en la misma unidad de tiempo, el resuelve encolando las dos peticiones, cuando ha resuelto la inserccion de un registro, luego inserta el otro, y no se produce la colisión.

    Sin embargo si la clave primaria no es identity, si ocurre una colisión, y el error.

    Las sentencias update por si mismas, resuelven el problema, quiero decir, que no entran en conflicto, porque si entran las dos a la vez, una se ejecuta primero, y hasta que no terminado la otra no se ejecuta porque el registro esta bloquedo por la primera. Pero el resultado, es que si no esta bien programado, si cambias el valor de la misma fila, al final, la concurrencia hará que el valor que quede registrado es el de la sentencia que entro en segundo lugar.

    En definitivas cuentas, que para salvar los problemas de concurrencia, hace falta trabajo y un buen diseño de base de datos. Si el diseño no es tan bueno, entonces, hace falta mucho trabajo.

    Espero haberme explicado bien.

    Un saludo


    sábado, 16 de junio de 2018 5:44
  • Entonces, dónde se puede consultar algo para resolver esa complejidad ? O no hay forma de resolverla ?

    Lic. Osvaldo Torchia Estrada

    sábado, 27 de octubre de 2018 19:24
  • Hola LemCom:

    Si tus tablas tienen un campo clave primaria identity, Sql server te garantiza que no habrá colisiones.

    No garantiza la simultaneidad de los números.

    Propiedad Identity:

    https://docs.microsoft.com/es-es/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017

    Ejemplo

    create table ejemploIdentidad
    (
    	id int identity(1,1) primary key,
    	col1 int, 
    	col2 int
    )
    go
    insert into ejemploIdentidad
    (col1, col2) /*las columnas identity no se mencionan en la insercción*/
    values
    (1,1),(1,2),(1,3),(2,1),(2,2),(2,3)
    go
    select * from ejemploIdentidad
    go
    /*Saltos producidos por deshacer transacciones*/
    begin tran
    insert into ejemploIdentidad
    (col1, col2) /*Al deshacer esta insercción dejará un hueco*/
    values
    (3,1)
    rollback tran
    go
    begin tran
    insert into ejemploIdentidad
    (col1, col2) 
    values
    (3,1)
    commit tran
    go
    select * From ejemploIdentidad
    

    Salida:


    • Editado Javi Fernández F domingo, 28 de octubre de 2018 6:28 Poner vínculo al enlace
    domingo, 28 de octubre de 2018 6:16
  • Saludos,

    Un punto importante es como accedes a la información de isolation level, y en que momento estas teniendo esta colición como la llamas, es un lock, es un deadlock? Podrias ser mas claro por favor.


    Blog: www.sqlservertoolbox.blogspot.com.mx

    lunes, 29 de octubre de 2018 21:07