Domanda

Ho una situazione peculiare. Ho tabelle a cui si accede costantemente da diverse parti del nostro codice e migliaia di clienti e quindi abbiamo impiegato l'uso delle transazioni quando facciamo semplici aggiornamenti e inserti sulle nostre tabelle. Il problema è che continuiamo a ottenere errori di deadlock. Qualcuno ha idea di come posso alleviare questo problema?

È stato utile?

Soluzione

I deadlock possono sorgere per molte ragioni e combinazioni:

  • Progettazione di schema scadente

  • Indici errati per il carico di lavoro delle query

  • TSQL scritto male

  • Livelli di isolamento delle transazioni aggressive e/o transazioni aperte a lungo termine

  • Scarsi modelli di accesso all'applicazione

  • Specifiche basse o hardware configurato in modo errato

Tutti questi sono comuni.

Ti suggerisco di leggere

Altri suggerimenti

Questo problema non è troppo peculiare: è tipico quando gli sviluppatori non sanno molto su come funziona il blocco e pensano solo alle transazioni come "scatole nere" e si aspettano che le loro soluzioni si ridimensionano.

Mitch ha ragione nei commenti sul pagamento di qualcuno che è un esperto - questo è un problema troppo grande per qualsiasi soluzione su così. Dovrai essere armato di tracce di query che causano deadlocks e dovrai analizzare tutto, dai tuoi indici alla progettazione della tabella, ai livelli di isolamento delle transazioni, ai tuoi modelli di query.

Suggerisco di iniziare con SQL Server Profiler e di impostare una traccia che genererà un grafico a deadlock. Ciò identificherà almeno le tue domande sul problema e le risorse che sono deviazioni. Imposta un'altra traccia alla ricerca di query lente (> diciamo, 100 ms) e accelera anche quelle. Più a lungo le tue query eseguono, maggiore è la probabilità di contesa a blocchi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top