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

Preguntas similare

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
Respuesta Responder a este mensaje
#2 Enrique Catala Bañuls
02/10/2007 - 20:35 | Informe spam
Hola, primero acuerdate que los modificadores de aislamiento se aplican a las
tablas afectadas con lo que el with(nolock) se lo has de poner tambien a
tabla1.

En segundo lugar, el insert no bloqueara a nadie puesto que estas haciendo
lectura sucia con el NOLOCK.

Si tu procedimiento almacenado no hace nada mas que esas dos cosas, no te
preocupes que esta bien en cuanto a que no se va a bloquear nadie.

Ten en cuenta que si tu arquitectura se basa en estos "@id" vas a tener
problemas de concurrencia porque se va a dar el caso que dos personas
obtengan el mismo @id y luego hagan el insert con el mismo id, pero si no
pasa nada si se produce esta situación adelante.

Salu2!
Atentamente, Enrique Catala Bañuls


"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
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida