Consulta sobre bloqueos

28/02/2006 - 14:29 por jcac | Informe spam
Hola lista,

A nosotros nos vendieron una aplicacion que inicialmente corria sobre SQL
Server 6.5, al parecer primero la migraron despues solo a SQL Server 7.0 y
de alli a SQL Server 2000.

El hecho es que estamos un poco confundidos ya que exite un proceso en el
modulo de ventas que finalmente bloquea varias tablas a la ves, es decir que
cuando se hace una factura o boleta, bloquea las tablas de cabecera y
detalle de las ventas, las tablas de cabecera detalle del kardex,
adicionalmente hay una tabla de saldos la cual tambien la bloquea, tambien
bloquea las tablas de cuentas corrientes (cabecera detalle) y finalmente las
tablas de contabilidad donde se ingresa su respectivo asiento contable
(cabecera - detalle).

El programa incialmente le faltaba control sobre los errores, les hemos
colocado sus respectivos controles en los cuales a veces si hay bloqueos y
se produce tiempo de espera, es decir no lo vote al usuario del programa,
esto funciona en el codigo fuente normalmente, pero cuando se realiza desde
el ejecutable, al parecer el servidor no emite ningun problema de tiempo de
espera y simplemente lo cierra el programa.

El programa esta hecho en Visual Basic 6.0 con el sp6.

Ahora las transacciones se manejan desde el Visual, es decir que cuando va a
grabar se le coloca Coneccion.begintran y despues Conecciion.Committra y
bueno si hubiera un error Coneccion.Rollback.

Expliquenme si hay otra manera de poder manejar los bloqueos o es que no
deberia de hacer desde visual y mas bien los deberia de pasar a SQL pero
tendria que tener muchos calculos en SQL y creo que no serian ideal hacer
eso, pienso que eso es mejor hacerlo en Visual

Gracias por su tiempo

Saludos

Preguntas similare

Leer las respuestas

#6 jcac
28/02/2006 - 16:25 | Informe spam
Gracias Mauro,

Probare lo que me indicas y ya les contare como nos va, una ves mas gracias
por su tiempo.

Saludos


"Mauro" escribió en el mensaje
news:%
aparte de lo que menciono Maxi.
te paso unos datos que te van a servir a detectar exactamente dopnde tenes
los bloqueos.

primero corre esto desde el query analizer:
dbcc traceon(3604)
dbcc traceon(3605)
dbcc traceon(1204)
dbcc traceon(1205)
dbcc tracestatus(-1)

eso te va a escribir entradas en el log del sql con la info de los
deadlocks. luego de un rato o cuando sepas que hubo un deadlock.
copia y abri el archivo de log del sql "errorlog" que esta en "C:\Program
Files\Microsoft SQL Server\MSSQL\LOG"
en el busca el string "deadlock was found" . y subi un poco en la hoja,
vas
a encontrar algo como esto:

2006-02-21 17:04:09.10 spid4 Node:1
2006-02-21 17:04:09.10 spid4 KEY: 7:409768517:12 (630078d8a877)
CleanCnt:1 Mode: U Flags: 0x0
2006-02-21 17:04:09.10 spid4 Grant List 1::
2006-02-21 17:04:09.10 spid4 Owner:0x42bd7700 Mode: U
Flg:0x0
Ref:1 Life:00000000 SPID:93 ECID:0
2006-02-21 17:04:09.10 spid4 SPID: 93 ECID: 0 Statement Type:
UPDATE
Line #: 21
2006-02-21 17:04:09.10 spid4 Input Buf: Language Event: UPDATE
tabla
SET xxxx = 0, xxxx = 0, xxxxxxxxxxx = '',
2006-02-21 17:04:09.10 spid4 Requested By:
2006-02-21 17:04:09.10 spid4 ResType:LockOwner Stype:'OR' Mode: U
SPID:81 ECID:0 Ec:(0x321F55D0) Value:0x3e50f380 Cost:(0/B7C10)
2006-02-21 17:04:09.10 spid4
2006-02-21 17:04:09.10 spid4 Node:2
2006-02-21 17:04:09.10 spid4 KEY: 7:409768517:1 (6300bf25f609)
CleanCnt:1 Mode: X Flags: 0x0
2006-02-21 17:04:09.10 spid4 Grant List 3::
2006-02-21 17:04:09.10 spid4 Owner:0x2fca9c80 Mode: X
Flg:0x0
Ref:0 Life:02000000 SPID:81 ECID:0
2006-02-21 17:04:09.10 spid4 SPID: 81 ECID: 0 Statement Type:
DELETE
Line #: 135
2006-02-21 17:04:09.10 spid4 Input Buf: Language Event: Exec
exportdata 2
2006-02-21 17:04:09.10 spid4 Requested By:
2006-02-21 17:04:09.10 spid4 ResType:LockOwner Stype:'OR' Mode: U
SPID:93 ECID:0 Ec:(0x7DA5F580) Value:0x42beaea0 Cost:(0/964)
2006-02-21 17:04:09.10 spid4 Victim Resource Owner:
2006-02-21 17:04:09.10 spid4 ResType:LockOwner Stype:'OR' Mode: U
SPID:93 ECID:0 Ec:(0x7DA5F580) Value:0x42beaea0 Cost:(0/964)
2006-02-21 17:04:09.10 spid4
2006-02-21 17:04:09.10 spid4 End deadlock search 142101 ... a deadlock
was found.

aca hay mucha informacion pero lo mas importatnte es los key de los nodos
involucrados(pueden ser mas de 2):
KEY 409768517:12 y KEY: 409768517:1
fijate que el 7 de adelante lo obie en esta ocasion
Statement type, te dice cual fue la peracion y LINE te da la linea del
bacht
o el SP en donde esta la instruccion
INPUT BUFFER te va a dar el comando exacto que se estaba ejecutando que es
el que coincide en la linea que te informa arriba


ok ahora, sabemos cuales fueron las instrucciones y hasta en que linea
estan
,pero no sabemos cual fue el recurso por el que entraron en competencia
para eso tenemos que usar las keys que mencione antes con la siguiente
consulta, fijate la correlacion,id es la tabla, y indid el indice

KEY 409768517:12 y KEY: 409768517:1

select
object_name([id]),[name]
from
sysindexes
where
([id] = 409768517and indid = 12)
or ([id] = 409768517and indid = 1)

si no encontras deadlocks y solo son bloqueos. hay otro metodo que te
puedo
enseñar.

por otro lado podes controlar los contadores del perfmon para ver el uso
de
disco y memoria, quizas tengas un cuello de botella,seguramente en el
disco.
espero que te sirva, a mi me sirvio mucho.
Mauro



"Maxi" wrote in message
news:
Hola, a ver, los bloqueos los maneja el motor con las transacciones por


ej:
entonces: a considerar:

Transacciones pequeñas.

Revisa que hacen tus procesos, quizas estas transacciones sean muy largas


ya
sea porque usan cursores o no estan bien opetimizadas, pensa que un
insert
no deberia demorar casi nada, si demora mucho y encima lo tenes en una
transaccion global se va a poner en bloqueo.

Revisa como estan los indices tambien y si hay triggers.

Como ves hay muchas cosas que mirar, no es simple con lo que has


mencionado
y no se puede desde un news poder ver todo esto.

Opciones:
1) Revias con el profiler los procesosa
2) contratas horas de consultoria para que hagan un analisis del sistema


Salu2
Maxi [MVP SQL SERVER]
www.sqlgurus.org


"jcac" escribió en el mensaje
news:
> Hola lista,
>
> A nosotros nos vendieron una aplicacion que inicialmente corria sobre


SQL
> Server 6.5, al parecer primero la migraron despues solo a SQL Server
> 7.0


y
> de alli a SQL Server 2000.
>
> El hecho es que estamos un poco confundidos ya que exite un proceso en


el
> modulo de ventas que finalmente bloquea varias tablas a la ves, es
> decir
> que cuando se hace una factura o boleta, bloquea las tablas de cabecera


y
> detalle de las ventas, las tablas de cabecera detalle del kardex,
> adicionalmente hay una tabla de saldos la cual tambien la bloquea,


tambien
> bloquea las tablas de cuentas corrientes (cabecera detalle) y
> finalmente
> las tablas de contabilidad donde se ingresa su respectivo asiento


contable
> (cabecera - detalle).
>
> El programa incialmente le faltaba control sobre los errores, les hemos
> colocado sus respectivos controles en los cuales a veces si hay
> bloqueos


y
> se produce tiempo de espera, es decir no lo vote al usuario del


programa,
> esto funciona en el codigo fuente normalmente, pero cuando se realiza
> desde el ejecutable, al parecer el servidor no emite ningun problema de
> tiempo de espera y simplemente lo cierra el programa.
>
> El programa esta hecho en Visual Basic 6.0 con el sp6.
>
> Ahora las transacciones se manejan desde el Visual, es decir que cuando


va
> a grabar se le coloca Coneccion.begintran y despues
> Conecciion.Committra


y
> bueno si hubiera un error Coneccion.Rollback.
>
> Expliquenme si hay otra manera de poder manejar los bloqueos o es que
> no
> deberia de hacer desde visual y mas bien los deberia de pasar a SQL
> pero
> tendria que tener muchos calculos en SQL y creo que no serian ideal


hacer
> eso, pienso que eso es mejor hacerlo en Visual
>
> Gracias por su tiempo
>
> Saludos
>






email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida