Interbloqueo en INSERT

09/09/2009 - 15:36 por Victor Koch | Informe spam
Hola,

Tengo una aplicación ERP desarrollada en VB6. Esta aplicación esta corriendo
hace varios años en cientos de clientes, demás esta decir que la aplicación
es multiusuario y los clientes la usan en varias terminales a la vez, hasta
ahora nunca tuve reportes de mis clientes de errores de interbloqueo.

Un cliente se hizo desarrollar una aplicación, también en VB6, que accede a
la base de datos, SS2000, de mi sistema, esta aplicación lee y graba en la
base de datos.

El problema que estoy teniendo, con bastante frecuencia, en mi sistema es
que salta el error 1205, es decir mi transacción fue elegida como sujeto del
interbloqueo, pero lo raro es que siempre salta en los INSERT.

Mi aplicación cada vez que detecta un error al leer o grabar en la base
graba en un archivo secuencial un log de errores y cancela la transacción,
les pego uno de los errores de interbloqueo.

7.0.451 06/08/2009 13:28:43 Usuario: MAÑANA PC Name: VMCAJA Usuario de
red: VMCaja
Operacion: Insertando Items Error Nro.:-2147467259 Descripcion: La
transacción (id. de proceso 57) quedó en interbloqueo en bloqueo recursos
con otro proceso y fue elegida como sujeto del interbloqueo. Ejecute de
nuevo la transacción.
Origen: Microsoft OLE DB Provider for SQL Server Estado de SQL:
40001 Error nativo: 1205
Sentencia: INSERT INTO ITITEMS
(FECEMISION,CODMOV,NROCOMP,LETRA,ITEM,ARTICULO,REGISTRO,ES,SIGNO,PRESENTA,DESCUENTO,LISTAPRE,COMISION,BULTOS,UNIDADES,PIEZAS,OPERACION,DESPACHO,TASA,PRECIOML,PRECIOIMML,TOTALML,GRAVT1ML,NOGRAVT1ML,IVAT1ML,IVANOIT1ML,BONIFICML,PPPML,PUCML,COMISIONML,PERCIBML,PERCIVAML,IMPINTML,DESCARTML,PRECVTAML,RECFINML,FILLER1,PRECIOME,PRECIOIMME,TOTALME,GRAVT1ME,NOGRAVT1ME,IVAT1ME,IVANOIT1ME,BONIFICME,PPPME,PUCME,COMISIONME,PERCIBME,PERCIVAME,IMPINTME,DESCARTME,PRECVTAME,RECFINME,ITEMPED,PARTIDA,FECTRANS,DESCART,FECANULACION,DEPARTAMENTO,NROREQ,ITEMREQ,PLANILLA,FILLER,FECALTA,USUARIO,FACTURA)
VALUES ({d
'2009-08-06'},'65','030300348552','A','0001','1200000007','70','S',-1,'03',
0,'01', 0, 1, 1, 0,NULL,NULL,'1', 3950, 4345, 4345, 3950, 0, 395, 0, 0,
3000.713, 1155.25, 0, 0, 0, 0, 0, 3950, 0,NULL, .94, 1.03, 1.03, .94, 0,
.09, 0, 0, .72, .25, 0, 0, 0, 0, 0, .94,
0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,{ts '2009-08-06
13:28:32'},'MAÑANA',NULL)

Todavia no hable con el programador para saber como esta accediendo y
actualizando la base de datos, porque es de otro país, pero yo sospecho que
esa aplicación externa esta haciendo mal uso o abuso de la base de datos,
creo que la forma de acceder y actualizar la base no es la correcta, me
inclino a que el programador usa DataControl o abre recordsets para insertar
o actualizar registros bloqueando por demasía paginas de registros.

La pregunta es:

Puede ser que haciendo abuso o mal uso de recordset's para insertar y
actualizar registros se castiguen los INSERT y salte el error de
interbloqueo ?

Gracias.

Un Saludo, Víctor Koch
 

Leer las respuestas

#1 Ruben Garrigos
09/09/2009 - 15:44 | Informe spam
Hola Victor:

Es muy probable que el problema sí venga por lo que comentas, por el abuso
de otra aplicación. El problema es que en estas situaciones el que sale "perdiendo"
es el que lo hace peor. Es decir, SQL Server trata a todas las operaciones
como si fuesen igualmente correctas y razonables ante un interbloqueo. La
víctima se elegirá en función del coste que tenga hacer el rollback de cada
operación, haciendose rollback de aquellas menos costosas de deshacer (potencialmente
las mejores implementadas).

Ante una situación como esta lo que podrías hacer es monitorizar los bloqueos,
la duración de éstos, etc. de forma que puedas demostrar a la otra parte
que lo que está haciendo es muy discutible desde el punto de vista técnico,
de rendimiento, etc.

Suerte! :)

Un saludo,

Rubén Garrigós
Solid Quality Mentors

Blog: http://blogs.solidq.com/es/elrincondeldba

Hola,

Tengo una aplicación ERP desarrollada en VB6. Esta aplicación esta
corriendo hace varios años en cientos de clientes, demás esta decir
que la aplicación es multiusuario y los clientes la usan en varias
terminales a la vez, hasta ahora nunca tuve reportes de mis clientes
de errores de interbloqueo.

Un cliente se hizo desarrollar una aplicación, también en VB6, que
accede a la base de datos, SS2000, de mi sistema, esta aplicación lee
y graba en la base de datos.

El problema que estoy teniendo, con bastante frecuencia, en mi sistema
es que salta el error 1205, es decir mi transacción fue elegida como
sujeto del interbloqueo, pero lo raro es que siempre salta en los
INSERT.

Mi aplicación cada vez que detecta un error al leer o grabar en la
base graba en un archivo secuencial un log de errores y cancela la
transacción, les pego uno de los errores de interbloqueo.

7.0.451 06/08/2009 13:28:43 Usuario: MAÑANA PC Name: VMCAJA Usuario
de
red: VMCaja
Operacion: Insertando Items Error Nro.:-2147467259
Descripcion: La
transacción (id. de proceso 57) quedó en interbloqueo en bloqueo
recursos
con otro proceso y fue elegida como sujeto del interbloqueo. Ejecute
de
nuevo la transacción.
Origen: Microsoft OLE DB Provider for SQL Server Estado de
SQL:
40001 Error nativo: 1205
Sentencia: INSERT INTO ITITEMS
(FECEMISION,CODMOV,NROCOMP,LETRA,ITEM,ARTICULO,REGISTRO,ES,SIGNO,PRESE
NTA,DESCUENTO,LISTAPRE,COMISION,BULTOS,UNIDADES,PIEZAS,OPERACION,DESPA
CHO,TASA,PRECIOML,PRECIOIMML,TOTALML,GRAVT1ML,NOGRAVT1ML,IVAT1ML,IVANO
IT1ML,BONIFICML,PPPML,PUCML,COMISIONML,PERCIBML,PERCIVAML,IMPINTML,DES
CARTML,PRECVTAML,RECFINML,FILLER1,PRECIOME,PRECIOIMME,TOTALME,GRAVT1ME
,NOGRAVT1ME,IVAT1ME,IVANOIT1ME,BONIFICME,PPPME,PUCME,COMISIONME,PERCIB
ME,PERCIVAME,IMPINTME,DESCARTME,PRECVTAME,RECFINME,ITEMPED,PARTIDA,FEC
TRANS,DESCART,FECANULACION,DEPARTAMENTO,NROREQ,ITEMREQ,PLANILLA,FILLER
,FECALTA,USUARIO,FACTURA)
VALUES ({d
'2009-08-06'},'65','030300348552','A','0001','1200000007','70','S',-1,
'03', 0,'01', 0, 1, 1, 0,NULL,NULL,'1', 3950, 4345, 4345, 3950, 0,
395, 0, 0, 3000.713, 1155.25, 0, 0, 0, 0, 0, 3950, 0,NULL, .94, 1.03,
1.03, .94, 0, .09, 0, 0, .72, .25, 0, 0, 0, 0, 0, .94,
0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,{ts '2009-08-06
13:28:32'},'MAÑANA',NULL)

Todavia no hable con el programador para saber como esta accediendo y
actualizando la base de datos, porque es de otro país, pero yo
sospecho que esa aplicación externa esta haciendo mal uso o abuso de
la base de datos, creo que la forma de acceder y actualizar la base no
es la correcta, me inclino a que el programador usa DataControl o abre
recordsets para insertar o actualizar registros bloqueando por demasía
paginas de registros.

La pregunta es:

Puede ser que haciendo abuso o mal uso de recordset's para insertar y
actualizar registros se castiguen los INSERT y salte el error de
interbloqueo ?

Gracias.

Preguntas similares