Ho un'applicazione java che sta eseguendo più operazioni CRUD simultanee su un database. Sto aggiungendo il supporto per SQLServer ma sto avendo problemi con deadlock durante le eliminazioni simultanee. Dopo alcune indagini è emerso che il problema potrebbe essere dovuto al blocco dell'escalation su un determinato tavolo.deadlock SQLServer
Nel tentativo di risolvere il problema, ho deciso di eseguire tutte le letture sul tavolo in questione "per aggiornamento" utilizzando l'hint UPDLOCK in modo da evitare il deadlock. Tuttavia, sto ancora vedendo il problema. Ho permesso tracing in SQLServer e hanno trovato la seguente traccia di stallo nei registri di SQLServer:
Deadlock incontrato .... Stampa di informazioni deadlock grafo delle attese
nodo: 1 CHIAVE: 5: 72057594042384384 (54048e7b3828) CleanCnt: 3 Modalità: X Flags: 0x0 Concessione Lista 1: proprietario: 0x03D08C40 Modalità: X Flg: 0x0 Ref: 0 di vita: 02 milioni SPID: 62 ECID: 0 XactLockInfo: 0x04834274 SPID: 62 ECID: 0 Statement Digitare: DELETE Line #: 1 Input Buf: Language Event: (@ P0 nvarchar (4000)) delete from part_data where part_id = @ P0 Richiesto da: ResType: LockOwner Stype: 'OR'Xdes: 0x04B511C8 Modalità: U SPID: 60 BatchID: 0 ECID: 0 TaskProxy: (0x058BE378) Valore: 0x3d08500 Costo: (0/1296)
Nodo: 2
LEGENDA: 5: 72057594042384384 (f903d6d6e0ac) CleanCnt: 2 Modalità: X Flags: 0x0 Concessione Lista 0: proprietario: 0x03D088A0 Modalità: X Flg: 0x0 Ref: 0 di vita: 02 milioni SPID: 60 ECID: 0 XactLockInfo: 0x04B511EC SPID: 60 ECID: 0 Tipo di istruzione: DELETE Riga numero: 1 Input Buf: Language Event: (@ P0 nvarchar (4000)) delete from part_data where part_id = @ P0 ResType: LockOwner Stype: 'OR'Xdes: 0x04834250 Modalità: U SPID: 62 BatchID: 0 ECID: 0 TaskProxy :(0x047BA378) Valore: Costo 0x3d089e0: (0/4588)
Vittima Resource Proprietario: restype: LockOwner Stype: 'OR'Xdes: Modalità 0x04B511C8: U SPID: 60 BatchID: 0 ECID: 0 TaskProxy: (0x058BE378) Valore : 0x3d08500 Costo: (0/1296)
SQLServer profiler lo mostra come due client con blocchi di aggiornamento (U) e che tentano di eseguire l'escalation su blocchi (X) esclusivi. I documenti SQLServer che ho letto dicono che solo un client può avere un blocco (U) su una tabella in un dato momento, quindi mi chiedo perché sto visualizzando la situazione mostrata nella traccia.
L'oggetto di database a cui fa riferimento quella traccia è un indice su una chiave esterna. Se qualcuno con esperienza nel risolvere questo tipo di problemi potrebbe offrire consigli, sarebbe di grande aiuto.
Grazie, Brad.
EDIT aggiunto stallo grafico XML come richiesto:
<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>
Hai una cancellazione a cascata da qualche parte? –
Ciao Stefan. No, non ho vincoli di eliminazione a cascata. – Brad
formato di schermata Web di non importa, copia/incolla in un file .XML locale e aprilo e sarà bello –