2009-07-10 13 views
6

Quando si esegue una stored procedure (da un'applicazione .NET) che esegue un INSERT e un UPDATE, a volte ottengo questo errore (ma non molto spesso) :Sybase ASE: "Il comando del server ha rilevato una situazione di deadlock"

ERROR [40001] [DataDirect][ODBC Sybase Wire Protocol driver][SQL Server]Your server command (family id #0, process id #46) encountered a deadlock situation. Please re-run your command.

Come posso risolvere questo?

Grazie.

+1

Sai cos'è un deadlock, perché può verificarsi un deadlock ... e perché * sta * accadendo con * il tuo * codice? Hai provato a usare Google come "sybase" e "deadlock"? – ChrisW

+0

Sì, lo so, sì, ho cercato su Google. Il fatto è che la situazione di stallo si verifica molto raramente. Poiché la query è semplice (un aggiornamento e un inserto), dovrebbe essere nel peggiore dei casi * ritardata * dal server se qualche altro blocco lo blocca, non solo buttarlo fuori. Inoltre, l'errore non dice su quale era il deadlock (quale tabella, riga, ecc.) Che rende difficile risolvere il problema. Non riesco a impedire manualmente l'accesso a 2 query sul server allo stesso tempo! – Laurent

+1

Un deadlock non ritarda mai altri processi interrompe l'altro processo - Vorrei saperne di più su deadlock come non hai mostrato comprensione – Mark

risposta

0

Supponendo che le tabelle siano correttamente indicizzate (e che si stiano effettivamente utilizzando quegli indici, vale sempre la pena controllare tramite il piano di query), si potrebbe provare a rompere le parti componenti dell'SP in basso e ad avvolgerle in transazioni separate in modo che ciascuna unità il lavoro è completato prima che inizi il prossimo.

begin transaction 
    update mytable1 
    set mycolumn = "test" 
    where ID=1 

commit transaction 
go 

begin transaction 
    insert into mytable2 (mycolumn) select mycolumn from mytable1 where ID = 1 
commit transaction 
go 
+0

In realtà, oggi ho avuto di nuovo lo stesso problema, con una stored procedure che contiene solo una singola istruzione (un INSERT) ... – Laurent

6

La cosa migliore per risolvere voi deadlocking problema è quello di impostare "informazioni deadlock di stampa" per sull'uso

sp_configure "informazioni di stampa stallo", 1

Ogni volta c'è una situazione di stallo questo stampa informazioni su quali processi sono stati coinvolti e quali sono stati in esecuzione al momento del blocco.

Se le tabelle utilizzano il blocco di tutte le pagine. Può ridurre i deadlock per passare al blocco di datarows o datapages. Se lo fai, assicurati di raccogliere nuove statistiche sulle tabelle e ricreare indici, viste, stored procedure e trigger che accedono alle tabelle che vengono modificate. Se non lo fai, otterrai degli errori o non vedrai tutti i benefici del cambiamento a seconda di quelli che non vengono ricreati.

2

Ho una serie di app a lungo termine che occasionalmente sull'accesso alle tabelle lap e sybase genererà questo errore. Se controlli il registro del server di sybase, ti darà le informazioni complete sul perché è successo. Come: La sql che ha coinvolto i due processi che cercano di ottenere un blocco. Di solito uno cerca di leggere e l'altro fa qualcosa come una cancellazione. Nel mio caso le app sono in esecuzione in JVM separate, quindi non è possibile eseguire lo sychronize periodicamente.