Resolver problema con bloqueo de tablas

05/03/2007 - 19:19 por Manuel | Informe spam
Hola Foreros,
les saludo a todos desde Chile y los felicito por mantener viva la
comunidad...

les cuento mi problema, estamos con un colega creando una aplicación
en asp para cargar datos sobre un par de tablas, que pertenecen a una
aplicación mayor, en la cual constantemente estan ingresando
información (no contamos con los fuentes de esta aplicación, ya que es
un paquete cerrado)

Tablas
Comproba (cabecera comprobante)
Comprob1 (detalle comprobante)

El proceso cuando lo hemos probado funciona bien, no se presenta
ningún problema al insertar, actualizar o eliminar registros, todo
esto probado con usuarios conectados a la aplicación principal y
trabajando desde la nuestra.
Pero resulta que cada cierto tiempo y de forma completamente aleatoria
no inserta los datos, esto nos tiene parados en este momento y sin
poder entregar la aplicación.
hay veces en que solo hace parte del proceso, otras en que no hace
absolutamente nada.

Les envío el código de insersión para ambas tablas

strInsertaCompro=""
strInsertaCompro=strInsertaCompro & "INSERT INTO
COMPROBA(SucCod,ComAnoMes,ComTip,ComNum,ComNumRef,ComFchMov,ComFchIng,ComEst,ComGlo,ComMarUpd,ComUltLin,ComTotLin"
strInsertaCompro=strInsertaCompro & " ,EmpLla,
ComDocNum,ComTipDoc,ComEje, ComGru, ComMon,
ComEgrMod,ComEgrFor,ComEgrCue "
strInsertaCompro=strInsertaCompro &
" ,ComEgrTip,ComEgrCod,ComEgrSec,ComEgrGir,ComEgrVal,ComEgrChe,ComEgrFch
"
strInsertaCompro=strInsertaCompro &
" ,ComEgrEmi,ComAreCod,ComCenCod,ComFluTip,ComFluCod,ComOriCen,ComDia,ComMarRev,ComEgrOtr,ComIteCod )"
strInsertaCompro=strInsertaCompro & " VALUES (0," & ANOMES & ",3," &
iserial & " ," & algo & ",'" & fechaMvto & "' ,'" & fechaMvto & "',
2,'" & aaa & "', 0,2,2 "
strInsertaCompro=strInsertaCompro & " , 'EMP',0,0,0,0,0,0,0,0 "
strInsertaCompro=strInsertaCompro & " ,0,0,0,0,0,0,convert(datetime,'"
& Fec_Cent & "',103) "
strInsertaCompro=strInsertaCompro & " ,0,0,0,0,0,'CenCCb' ," & dia & ",
0,0,0) "

oConn.Execute (strInsertaCompro)

strInserta=""
strInserta=strInserta & "INSERT INTO
COMPROB1(SucCod,ComAnoMes,ComTip,ComNum,ComLin,PlaCod,AreCod,CenCod,IteCod,AnaTip"
strInserta=strInserta & " , AnaSec, AnaCod, ComMmon,
ComDebNac,ComHabNac,ComDebOtr,ComHabOtr, ComGloDet, ComRefNum,
ComRefFch,"
strInserta=strInserta & " ComRefVto,ComTasCam,ComCorAud, FluTip,
FluCod, ComMarLib, ComFchMov, ComTipCar,ComCarNum,ComCarSec"
strInserta=strInserta &
" ,ComTipCal,ComFchCal,ComHabO,ComDebO,ComHabN,ComDebN )"
strInserta=strInserta & " VALUES (0, " & ANOMES & " ,3 ," & iserial &
"," & i & ",'" & var_paso_pla_cod & "'," & arecod & ", " & Cencod & ",
0, " & anatip & " "
strInserta=strInserta & " ,0," & anacod & ",0," & d & "," & h &
",cast(REPLACE(' " & dolard & "',',','.') as
decimal(18,2)),cast(REPLACE(' " & dolarh & "',',','.') as
decimal(18,2)),'" & ComGloDet & "', '" & NUM_GUIA_PROV & "' ,'" &
fechaMvto & "' "
strInserta=strInserta & " ,convert(datetime,'" & fechaMvto & "',
103),cast(REPLACE(' " & comtaskam & "',',','.') as decimal(18,2))," &
i & ",0,0,1,convert(datetime,'" & fechaMvto & "',103),0,0,0 "
strInserta=strInserta & " ,0,convert(datetime,'" & Fec_Cent & "',
103),cast(REPLACE(' " & dolarh & "',',','.') as decimal(18,2)) ,
cast(REPLACE(' " & dolard & "',',','.') as decimal(18,2))," & h & ","
& d & " ) "

oConn.Execute (strInserta)


Cuando hemos trazado la aplicación principal con el analizador de sql
server, hemos conseguido el siguiente código.
Este código se presenta al momento de ir a ingresar el detalle del
comprobante.

SELECT SucCod, ComAnoMes, ComTip, ComNum, ComDia, ComNumRef, ComEje,
ComEst, ComFchIng, ComMarUpd, EmpLla, ComFchMov, ComFchPrc, ComGru,
ComMon, ComGlo, ComUltLin, ComIteCod, ComEgrOtr, ComTotLin FROM
COMPROBA (UPDLOCK) WHERE SucCod = @P1 AND ComAnoMes = @P2 AND ComTip @P3 AND ComNum = @P4


agradecería bastante cualquier tipo de ayuda que nos pudieran brindar,
o cualquier pista para poder resolver esto desde nuestra aplicación.


saludos

Manuel Sandoval
 

Leer las respuestas

#1 Carlos Sacristan
05/03/2007 - 19:40 | Informe spam
Comprueba el tipo de bloqueo que realiza la sentencia SELECT que posteas
al final. Si SQL no tiene un índice útil que le sirva para reducir el nivel
de bloqueo a fila, se ve obligado a realizarlo sobre la tabla, con lo que el
resto de las conexiones se verán penalizadas.

De todos modos, me choca que digas que a veces hace parte del proceso...
eso supone que no hay transacciones, con los problemas de incoherencia de
datos que te puedes encontrar. Yo lo veo más importante al hecho de que en
ciertos momentos se produzcan retrasos por bloqueos.


"Manuel" escribió en el mensaje
news:
Hola Foreros,
les saludo a todos desde Chile y los felicito por mantener viva la
comunidad...

les cuento mi problema, estamos con un colega creando una aplicación
en asp para cargar datos sobre un par de tablas, que pertenecen a una
aplicación mayor, en la cual constantemente estan ingresando
información (no contamos con los fuentes de esta aplicación, ya que es
un paquete cerrado)

Tablas
Comproba (cabecera comprobante)
Comprob1 (detalle comprobante)

El proceso cuando lo hemos probado funciona bien, no se presenta
ningún problema al insertar, actualizar o eliminar registros, todo
esto probado con usuarios conectados a la aplicación principal y
trabajando desde la nuestra.
Pero resulta que cada cierto tiempo y de forma completamente aleatoria
no inserta los datos, esto nos tiene parados en este momento y sin
poder entregar la aplicación.
hay veces en que solo hace parte del proceso, otras en que no hace
absolutamente nada.

Les envío el código de insersión para ambas tablas

strInsertaCompro=""
strInsertaCompro=strInsertaCompro & "INSERT INTO
COMPROBA(SucCod,ComAnoMes,ComTip,ComNum,ComNumRef,ComFchMov,ComFchIng,ComEst,ComGlo,ComMarUpd,ComUltLin,ComTotLin"
strInsertaCompro=strInsertaCompro & " ,EmpLla,
ComDocNum,ComTipDoc,ComEje, ComGru, ComMon,
ComEgrMod,ComEgrFor,ComEgrCue "
strInsertaCompro=strInsertaCompro &
" ,ComEgrTip,ComEgrCod,ComEgrSec,ComEgrGir,ComEgrVal,ComEgrChe,ComEgrFch
"
strInsertaCompro=strInsertaCompro &
"
,ComEgrEmi,ComAreCod,ComCenCod,ComFluTip,ComFluCod,ComOriCen,ComDia,ComMarRev,ComEgrOtr,ComIteCod
)"
strInsertaCompro=strInsertaCompro & " VALUES (0," & ANOMES & ",3," &
iserial & " ," & algo & ",'" & fechaMvto & "' ,'" & fechaMvto & "',
2,'" & aaa & "', 0,2,2 "
strInsertaCompro=strInsertaCompro & " , 'EMP',0,0,0,0,0,0,0,0 "
strInsertaCompro=strInsertaCompro & " ,0,0,0,0,0,0,convert(datetime,'"
& Fec_Cent & "',103) "
strInsertaCompro=strInsertaCompro & " ,0,0,0,0,0,'CenCCb' ," & dia & ",
0,0,0) "

oConn.Execute (strInsertaCompro)

strInserta=""
strInserta=strInserta & "INSERT INTO
COMPROB1(SucCod,ComAnoMes,ComTip,ComNum,ComLin,PlaCod,AreCod,CenCod,IteCod,AnaTip"
strInserta=strInserta & " , AnaSec, AnaCod, ComMmon,
ComDebNac,ComHabNac,ComDebOtr,ComHabOtr, ComGloDet, ComRefNum,
ComRefFch,"
strInserta=strInserta & " ComRefVto,ComTasCam,ComCorAud, FluTip,
FluCod, ComMarLib, ComFchMov, ComTipCar,ComCarNum,ComCarSec"
strInserta=strInserta &
" ,ComTipCal,ComFchCal,ComHabO,ComDebO,ComHabN,ComDebN )"
strInserta=strInserta & " VALUES (0, " & ANOMES & " ,3 ," & iserial &
"," & i & ",'" & var_paso_pla_cod & "'," & arecod & ", " & Cencod & ",
0, " & anatip & " "
strInserta=strInserta & " ,0," & anacod & ",0," & d & "," & h &
",cast(REPLACE(' " & dolard & "',',','.') as
decimal(18,2)),cast(REPLACE(' " & dolarh & "',',','.') as
decimal(18,2)),'" & ComGloDet & "', '" & NUM_GUIA_PROV & "' ,'" &
fechaMvto & "' "
strInserta=strInserta & " ,convert(datetime,'" & fechaMvto & "',
103),cast(REPLACE(' " & comtaskam & "',',','.') as decimal(18,2))," &
i & ",0,0,1,convert(datetime,'" & fechaMvto & "',103),0,0,0 "
strInserta=strInserta & " ,0,convert(datetime,'" & Fec_Cent & "',
103),cast(REPLACE(' " & dolarh & "',',','.') as decimal(18,2)) ,
cast(REPLACE(' " & dolard & "',',','.') as decimal(18,2))," & h & ","
& d & " ) "

oConn.Execute (strInserta)


Cuando hemos trazado la aplicación principal con el analizador de sql
server, hemos conseguido el siguiente código.
Este código se presenta al momento de ir a ingresar el detalle del
comprobante.

SELECT SucCod, ComAnoMes, ComTip, ComNum, ComDia, ComNumRef, ComEje,
ComEst, ComFchIng, ComMarUpd, EmpLla, ComFchMov, ComFchPrc, ComGru,
ComMon, ComGlo, ComUltLin, ComIteCod, ComEgrOtr, ComTotLin FROM
COMPROBA (UPDLOCK) WHERE SucCod = @P1 AND ComAnoMes = @P2 AND ComTip @P3 AND ComNum = @P4


agradecería bastante cualquier tipo de ayuda que nos pudieran brindar,
o cualquier pista para poder resolver esto desde nuestra aplicación.


saludos

Manuel Sandoval

Preguntas similares