Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come eliminare il deadlock in un'applicazione SQL Server 2005 e C#?

Non riesco a vedere alcun ambito di transazione esplicito nel tuo codice, quindi non so quali blocchi sono già in atto quando esegui l'aggiornamento; inoltre non è chiaro quale livello di isolamento stai utilizzando. Ma lo scenario più comune in questo tipo di situazione è che in precedenza nella stessa transazione hai emesso un select (blocco di lettura) sulle stesse righe che stai tentando di aggiornare in seguito. Ciò causerà un'escalation del blocco e può comportare un deadlock se due transazioni tentano di fare la stessa cosa:

  1. Transazione A:seleziona con blocco lettura
  2. Transazione B:seleziona con readlock
  3. Transazione A:aggiornamento - vuole aumentare il suo blocco di lettura in blocco di scrittura, ma deve attendere che la transazione B rilasci il suo blocco di lettura
  4. Transazione B:aggiornamento - desidera eseguire l'escalation del blocco di lettura in blocco di scrittura, ma deve attendere che la transazione A rilasci il blocco di lettura.

Bingo! deadlock poiché sia ​​A che B sono in attesa l'uno dell'altro per rilasciare i blocchi di lettura esistenti prima di poter eseguire l'aggiornamento.

Per evitare ciò, è necessario un suggerimento per l'updlock nella selezione, ad esempio

select * from table with (updlock) where blah blah

Ciò garantirà che la tua selezione utilizzi un blocco di scrittura invece di un blocco di lettura, che impedirà l'escalation del blocco tra transazioni simultanee.