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

#1 Maxi
28/02/2006 - 15:35 | Informe spam
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

Respuesta Responder a este mensaje
#2 jcac
28/02/2006 - 16:06 | Informe spam
Gracias Maxi,

Si hemos estado revizando lo que nos estas indicando y hemos encontrado que
hace uso de cursores y triggers en algunos procesos, ahora como te decia es
en una factura la cual primero crea la cabcera y despues lo hace 1 por 1 el
detalle. Esto demora algo prudencial es decir en una factura de 30 items.

Despues de ellos genera la cuenta corriente con lo que se crea un registro
por cabecera y un registro por detalle. Esto es rapido son solo insert.

Despues hace las actualizaciones del kardex con lo que es decir esto lo hace
con un cursor, esta de esa manera, pienso que por alli empesaremos a
cambiarlo, luego en esta tabla tiene un trigger que solo se ejeucta por un
item a la ves, es decir que si uno modifica varios items en grupo el trigger
no se ejecutara. La funcion de este trigger es actualizar la tabla de saldos
aparte de hacer calculos de multiplicacion y division y sumas y restas, lo
cual estamos asumiendo que pueda ser el problema.

Luego de ello viene la parte de la contabilidad la cual es pesada pero no
tanto como en la parte del kardex.

Gracias por tu tiempo y veremos como nos va.

Una consulta cuanto crees que nos costaria un tema de consultoria por este
caso.

Saludos

"Maxi" escribió en el mensaje
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





Respuesta Responder a este mensaje
#3 Maxi
28/02/2006 - 16:13 | Informe spam
Hola, bueno ya veo que tienen una linda ensalda de cosas a revisar
(triggers - cursores)

pd: cuanto saldria esto en una consultora? la verdad que no se, te puedo
decir que en mi pais la hora cuesta unos 50dls y despues dependera de
cuantas horas lleve ese proyecto.


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


"jcac" escribió en el mensaje
news:
Gracias Maxi,

Si hemos estado revizando lo que nos estas indicando y hemos encontrado
que hace uso de cursores y triggers en algunos procesos, ahora como te
decia es en una factura la cual primero crea la cabcera y despues lo hace
1 por 1 el detalle. Esto demora algo prudencial es decir en una factura de
30 items.

Despues de ellos genera la cuenta corriente con lo que se crea un registro
por cabecera y un registro por detalle. Esto es rapido son solo insert.

Despues hace las actualizaciones del kardex con lo que es decir esto lo
hace con un cursor, esta de esa manera, pienso que por alli empesaremos a
cambiarlo, luego en esta tabla tiene un trigger que solo se ejeucta por un
item a la ves, es decir que si uno modifica varios items en grupo el
trigger no se ejecutara. La funcion de este trigger es actualizar la tabla
de saldos aparte de hacer calculos de multiplicacion y division y sumas y
restas, lo cual estamos asumiendo que pueda ser el problema.

Luego de ello viene la parte de la contabilidad la cual es pesada pero no
tanto como en la parte del kardex.

Gracias por tu tiempo y veremos como nos va.

Una consulta cuanto crees que nos costaria un tema de consultoria por este
caso.

Saludos

"Maxi" escribió en el mensaje
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









Respuesta Responder a este mensaje
#4 Mauro
28/02/2006 - 16:14 | Informe spam
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
>


Respuesta Responder a este mensaje
#5 jcac
28/02/2006 - 16:24 | Informe spam
Gracias Maxi,

Veremos y nos trateremos de documentar y cambiar lo que se encuentre a
nuestro alcanse ya que pensando en que nos cueste $50 por hora que pienso
que aqui en Perú tambien deba de costar, no creo que lo vayan a aprobar.

Bueno si encuentro algo y no se si me pueda ayudar les comento para que me
den una mano.

Saludos


"Maxi" escribió en el mensaje
news:
Hola, bueno ya veo que tienen una linda ensalda de cosas a revisar
(triggers - cursores)

pd: cuanto saldria esto en una consultora? la verdad que no se, te puedo
decir que en mi pais la hora cuesta unos 50dls y despues dependera de
cuantas horas lleve ese proyecto.


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


"jcac" escribió en el mensaje
news:
Gracias Maxi,

Si hemos estado revizando lo que nos estas indicando y hemos encontrado
que hace uso de cursores y triggers en algunos procesos, ahora como te
decia es en una factura la cual primero crea la cabcera y despues lo hace
1 por 1 el detalle. Esto demora algo prudencial es decir en una factura
de 30 items.

Despues de ellos genera la cuenta corriente con lo que se crea un
registro por cabecera y un registro por detalle. Esto es rapido son solo
insert.

Despues hace las actualizaciones del kardex con lo que es decir esto lo
hace con un cursor, esta de esa manera, pienso que por alli empesaremos a
cambiarlo, luego en esta tabla tiene un trigger que solo se ejeucta por
un item a la ves, es decir que si uno modifica varios items en grupo el
trigger no se ejecutara. La funcion de este trigger es actualizar la
tabla de saldos aparte de hacer calculos de multiplicacion y division y
sumas y restas, lo cual estamos asumiendo que pueda ser el problema.

Luego de ello viene la parte de la contabilidad la cual es pesada pero no
tanto como en la parte del kardex.

Gracias por tu tiempo y veremos como nos va.

Una consulta cuanto crees que nos costaria un tema de consultoria por
este caso.

Saludos

"Maxi" escribió en el mensaje
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













Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida