Ho un processo con un Select che richiede molto tempo per terminare, nell'ordine di 5-10 minuti.
Attualmente non utilizzo NOLOCK come suggerimento per il motore di database MS SQL.
Allo stesso tempo abbiamo un altro processo che esegue aggiornamenti e inserimenti nello stesso database e nelle stesse tabelle.
Il primo processo è iniziato, poco per porre fine prematuramente con un messaggioCausa di un processo che è una vittima del deadlock
SQLEXCEPTION: Transaction critico sulle risorse di blocco con un altro processo ed è stata scelta come vittima del deadlock.
Questo primo processo è in esecuzione in altri siti in condizioni identiche ma con database più piccoli e quindi l'istruzione di selezione in questione richiede un periodo di tempo molto più breve (dell'ordine di 30 secondi o giù di lì). In questi altri siti, non ottengo il messaggio deadlock in questi altri siti. Inoltre, non ho ricevuto questo messaggio sul sito che ha inizialmente il problema, ma, presumo, dal momento che il database è cresciuto, credo di aver superato qualche soglia. Ecco le mie domande:
- Potrebbe il tempo necessario per l'esecuzione di una transazione rendere più probabile che il processo associato venga contrassegnato come vittima di un deadlock.
- Se eseguo la selezione con un suggerimento NOLOCK, rimuoverà il problema?
- Sospetto che un campo datetime controllato come parte della clausola WHERE nell'istruzione select causi il tempo di ricerca lento. Posso creare un indice basato su questo campo? È consigliabile?
Risposta parziale al punto 1: Non confondere un deadlock con un timeout. Se si è verificato un timeout, il tempo necessario per terminare una transazione potrebbe essere la causa dell'abbandono dell'altro. Inoltre, sarebbe utile sapere su quale risorsa si sta bloccando (è un indice o una tabella?). – NealB
SET DEADLOCK_PRIORITY HIGH ALTER DATABASE dbname SET MULTI_USER; – gstackoverflow