Tengo una aplicación Java que está realizando múltiples operaciones simultáneas CRUD en una base de datos. Estoy agregando soporte para SQLServer pero estoy teniendo problemas con el bloqueo durante las eliminaciones concurrentes. Después de algunas investigaciones, parece que el problema puede deberse a la escalada de bloqueo en una tabla en particular.Interbloqueo SQLServer
En un intento de solucionarlo, decidí hacer todas las lecturas sobre la tabla en cuestión para "actualizar" usando la sugerencia UPDLOCK para evitar el interbloqueo. Sin embargo, sigo viendo el problema. He habilitado el seguimiento en SQL Server y he encontrado la siguiente traza de interbloqueo en los registros de SQLServer:
punto muerto encontrado .... Impresión de información de interbloqueo Esperar por el gráfico
Nodo: 1 CLAVE: 5: 72057594042384384 (54048e7b3828) CleanCnt: 3 Modo: X Flags: 0x0 Grant List 1: Propietario: 0x03D08C40 Modo: X Flg: 0x0 Ref: 0 Vida: 02000000 SPID: 62 ECID: 0 XactLockInfo: 0x04834274 SPID: 62 ECID: 0 Statement Tipo: DELETE Número de línea: 1 Buf de entrada: Evento de idioma: (@ P0 nvarchar (4000)) eliminar de part_data donde part_id = @ P0 Solicitado por: restype: LockOwner Stype: 'OR'Xdes: Modo 0x04B511C8: U SPID: 60 BatchID: 0 ECID: 0 TaskProxy: (0x058BE378) Valor: 0x3d08500 Coste: (0/1296)
Node: 2
CLAVE: 5: 72057594042384384 (f903d6d6e0ac) CleanCnt: 2 Modo: Banderas X: 0x0 subvención Lista 0: propietario: Modo 0x03D088A0: X Flg: 0x0 Ref: 0 vida: 02000000 SPID: 60 ECID: 0 XactLockInfo: 0x04B511EC SPID: 60 ECID: 0 Tipo de extracto: DELETE Número de línea: 1 Buf de entrada: Evento de idioma: (@ P0 nvarchar (4000)) eliminar de part_data donde part_id = @ P0 Solicitado por: ResType: LockOwner Stype: 'OR'Xdes: 0x04834250 Modo: U SPID: 62 BatchID: 0 ECID: 0 TaskProxy :(0x047BA378) Valor: Costo 0x3d089e0: (0/4588)
propietario del recurso víctima: restype: LockOwner Stype: 'OR'Xdes: Modo 0x04B511C8: T SPID: 60: 0 BATCHID ECID: 0 TaskProxy: (0x058BE378) Valor : 0x3d08500 Costo: (0/1296)
El perfilador SQLServer muestra esto como dos clientes que tienen bloqueos de actualización (U) e intentan escalar a bloqueos exclusivos (X). Los documentos SQLServer que he leído dicen que solo un cliente puede tener un bloqueo (U) en una tabla en un momento dado, así que me pregunto por qué veo la situación mostrada en el rastreo.
El objeto de base de datos a que se hace referencia en ese rastreo es un índice en una clave externa. Si alguien con experiencia en solucionar este tipo de problemas pudiera ofrecer consejos, sería una gran ayuda.
Gracias, Brad.
EDITAR añadido estancamiento gráfico XML conforme a lo solicitado:
<deadlock-list>
<deadlock victim="process989018">
<process-list>
<process id="process6aa7a8" taskpriority="0" logused="4844" waitresource="KEY: 5:72057594042384384 (5504bdfb7529)" waittime="9859" ownerId="613553" transactionname="implicit_transaction" lasttranstarted="2009-05-08T11:52:39.137" XDES="0x5fcbc30" lockMode="U" schedulerid="1" kpid="3516" status="suspended" spid="59" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2009-05-08T11:52:39.183" lastbatchcompleted="2009-05-08T11:52:39.183" clientapp="jTDS" hostname="LOIRE" hostpid="123" loginname="sa" isolationlevel="read committed (2)" xactid="613553" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="40" sqlhandle="0x0200000007c76c39efdd8317c6fa7b611b4fd958f05cfcf4">
delete from part_data where part_id = @P0 </frame>
</executionStack>
<inputbuf>(@P0 nvarchar(4000))delete from part_data where part_id = @P0</inputbuf>
</process>
<process id="process989018" taskpriority="0" logused="1528" waitresource="KEY: 5:72057594042384384 (5e0405cb0377)" waittime="1250" ownerId="613558" transactionname="implicit_transaction" lasttranstarted="2009-05-08T11:52:39.183" XDES="0x48318f0" lockMode="U" schedulerid="2" kpid="2692" status="suspended" spid="60" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2009-05-08T11:52:39.183" lastbatchcompleted="2009-05-08T11:52:39.183" clientapp="jTDS" hostname="LOIRE" hostpid="123" loginname="sa" isolationlevel="read committed (2)" xactid="613558" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
<executionStack>
<frame procname="adhoc" line="1" stmtstart="40" sqlhandle="0x0200000007c76c39efdd8317c6fa7b611b4fd958f05cfcf4">
delete from part_data where part_id = @P0 </frame>
</executionStack>
<inputbuf>(@P0 nvarchar(4000))delete from part_data where part_id = @P0</inputbuf>
</process>
</process-list>
<resource-list>
<keylock hobtid="72057594042384384" dbid="5" objectname="MESSAGESTOREDB61.dbo.part_data" indexname="idx_part_data_part_id" id="lock3cab740" mode="X" associatedObjectId="72057594042384384">
<owner-list>
<owner id="process6aa7a8" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="process989018" mode="U" requestType="wait"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594042384384" dbid="5" objectname="MESSAGESTOREDB61.dbo.part_data" indexname="idx_part_data_part_id" id="lock3cad340" mode="X" associatedObjectId="72057594042384384">
<owner-list>
<owner id="process989018" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="process6aa7a8" mode="U" requestType="wait"/>
</waiter-list>
</keylock>
</resource-list>
</deadlock>
</deadlock-list>
¿Tiene una cascada de eliminar en algún lugar? –
Hola Stefan. No, no tengo ninguna restricción de eliminación en cascada. – Brad
formato de pantalla web de no importa, copie/pegue en un archivo .XML local y ábralo y se verá bien –