SQL Server - consulta de nolock en union

   
Vista:

consulta de nolock en union

Publicado por Ivonne (54 intervenciones) el 07/11/2009 17:42:29
Buenos días amigos de la web, algunas veces cuando se ejecuta el siguiente query:
select d.*
from INVMHD h (NOLOCK), INVMDT d (nolock), INVSAS s (nolock)
where h.f_alt between '20091106' and '20091106'
and (h.tpo_tra = 'ACDTRA' or h.tpo_tra = 'SMEREX')
and d.cia = h.cia
and d.alm = h.alm
and d.salm = h.salm
and d.consec_orig = h.consec_orig
and s.cia = h.cia
and s.alm = h.alm
and s.cve = h.salm
and s.cve_suc = 'A01'

union

select d.*
from INVMHD h , INVMDT d , INVSAS s
where h.referencia in (
select distinct h.referencia
from INVMHD h , INVMDT d , INVSAS s
where h.f_alt between '20091106' and '20091106'
and d.cia = h.cia
and d.alm = h.alm
and d.salm = h.salm
and d.consec_orig = h.consec_orig
and s.cia = h.cia
and s.alm = h.alm
and s.cve = h.salm
and s.cve_suc = 'A01')
and h.tpo_tra = 'DIFTRA'
and d.cia = h.cia
and d.alm = h.alm
and d.salm = h.salm
and d.consec_orig = h.consec_orig
and s.cia = h.cia
and s.alm = h.alm
and s.cve = h.salm
and (s.cve_suc = 'A01' or s.cve_suc = 'g05')
manda el siguiente mensaje :
<ERR> G05.ALM -INVMDT- La transacción (Id. de proceso 69) quedó en interbloqueo en lock recursos con otro proceso y fue elegida como sujeto del interbloqueo. Ejecute de nuevo la transacción..tengo la duda si las demas tablas aunque son las mismas igual debo de poner (nolock)..si alguien me puede asesor se lo agradezco mucho y gracias de antemano..Saludos,
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

RE:consulta de nolock en union

Publicado por Isaias (3181 intervenciones) el 10/11/2009 01:00:01
SQL Server, es un motor de base de datos TRANSACCIONAL, por tanto, un simple SELECT te genera una transaccion y puede (como es tu caso), generarte BLOQUEOS.

Para que esto no suceda, puede agregar NOLOCK, como lo haces en tu primer SELECT y que no incluyes en tu segundo select (despues del UNION)

Por otro lado, debes hacer uso de INNER JOIN y dejar la codificacion antigua para "ligar" tus tablas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar