evitar que un INSERT bloquee otros SELECT

02/10/2007 - 03:07 por DarthSidious | Informe spam
buenos dias!!!
tengo un stored procedure que hace un select de una tabla y despues
inserta en otra tabla un id que obtuvo de la primera.
Mi problema es que esto lo van a usar muchos usuarios
de forma concurrente y quiero evitar que se queden bloqueados, por el insert.

basicamente el stored procedure hace algo como esto:

select @id = tab1_id from tabla1 left join tabla2 with (nolock) on tab1_id =
tab2_id where tab2_id is null


insert into tabla2(etc,etc,etc) values(@id,etc,etc)

mi problema es que, deseo que cuando un usuario A esta haciendo el insert,
otro usuario B que ejecute el stored procedure no se quede bloqueado en el
primer select, esperando que el insert finalice o haga el commit y se libere
el bloqueo de la segunda tabla. Yo trate de solucionarlo agregandole el WITH
(NOLOCK) al primer select, como se aprecia mas arriba, pero, luego de buscar
informacion en la red, no me queda claro si el nolock me sirve para evitar
los bloqueos que pueda producir un insert. No importa que se lean registros
"sucios" de la segunda tabla, porque no es informacion de vida o muerte.

No se si soy claro, espero que si. desde ya muchas gracias por su tiempo!!!

salu2
 

Leer las respuestas

#1 Gux (MVP)
02/10/2007 - 17:11 | Informe spam
No comprendo bien su preocupación.

Para garantizar consistencia de los datos, el motor de SQL Server necesita
bloquear un dato para que otra sesión no lo altere a la misma vez. Una vez
actualizado el dato, el lock es liberado automáticamente para que otra sesión
pueda accederlo.

Si las transacciones son bien diseñadas, son de MUY corta duración y no se
observa retardo evidente en las aplicaciones.

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"DarthSidious" wrote:

buenos dias!!!
tengo un stored procedure que hace un select de una tabla y despues
inserta en otra tabla un id que obtuvo de la primera.
Mi problema es que esto lo van a usar muchos usuarios
de forma concurrente y quiero evitar que se queden bloqueados, por el insert.

basicamente el stored procedure hace algo como esto:

select @id = tab1_id from tabla1 left join tabla2 with (nolock) on tab1_id =
tab2_id where tab2_id is null


insert into tabla2(etc,etc,etc) values(@id,etc,etc)

mi problema es que, deseo que cuando un usuario A esta haciendo el insert,
otro usuario B que ejecute el stored procedure no se quede bloqueado en el
primer select, esperando que el insert finalice o haga el commit y se libere
el bloqueo de la segunda tabla. Yo trate de solucionarlo agregandole el WITH
(NOLOCK) al primer select, como se aprecia mas arriba, pero, luego de buscar
informacion en la red, no me queda claro si el nolock me sirve para evitar
los bloqueos que pueda producir un insert. No importa que se lean registros
"sucios" de la segunda tabla, porque no es informacion de vida o muerte.

No se si soy claro, espero que si. desde ya muchas gracias por su tiempo!!!

salu2

Preguntas similares