2009-04-06 23 views
14

Il mio sito Web non sembra gestire un numero elevato di visitatori, credo sia perché il server è troppo semplice.Ricerca guasti deadlock in Sql Server 2008

2 ore fa il mio sito web è stato sempre un sacco di colpi e ho notato che 3 errori di deadlock si è verificato, l'errore è:

System.Data.SqlClient.SqlException : transazione (ID di processo 58) è stato bloccato nella chiusura delle risorse con un altro processo ed è stato scelto come vittima del deadlock. Rieseguire la transazione.

Non sono sicuro del motivo per cui questo è accaduto ... Guardando la traccia dello stack, ho potuto vedere che questo è successo con una query di selezione.

Qualcuno sa quale potrebbe essere la causa di questo errore?

Il server esegue Windows 2008 e SQL Server 2008.

+0

http://support.microsoft.com/?kbid=832524 * EDIT * qui è un collegamento aggiornato alla documentazione di SQL Server Profiler, anche se la teoria nel link qui sopra detiene ancora. http://msdn.microsoft.com/en-us/library/ms188246.aspx – GregC

risposta

6

Scrive bloccherà legge su SQL Server, a meno che non si dispone delle versioni delle righe abilitato. È necessario utilizzare la stored procedure sp_who2 e una traccia di SQL Profiler. sp_who2 ti dirà quali processi stanno bloccando quale e il profiler ti dirà quale era l'ultima dichiarazione per il processo di blocco.

-3

Se non ti dispiace leggere sporco puoi provare a mettere (NOLOCK) dopo i nomi delle tabelle nelle query SELECT. Il compromesso qui è che non ti sono garantiti i dati più aggiornati come le istruzioni UPDATE e INSERT attualmente in esecuzione vengono ignorate.

Di solito questo non è a molto di un treno-tormentone come la maggior parte dei sistemi leggono molto più di quanto l'aggiornamento/inserimento, ma ovviamente dipende dalla natura della vostra applicazione.

hanno alternativa un'occhiata a http://www.sql-server-performance.com/tips/deadlocks_p1.aspx

+4

nolock, senza capire esattamente * * la conseguenza di "non garantiti la più dati aggiornati" è una pessima idea. –

+1

Consiglio vivamente di utilizzare NOLOCK. Mi rendo conto che questo è un vecchio post ma sento di dover offrire un avvertimento a tutti coloro che si imbattono in questo (come ho fatto io) cercando aiuto con deadlock. Personalmente ho visto le conseguenze descritte dai mali di NOLOCK - e sono difficili da pulire. Non permettere a NOLOCK di diventare un'abitudine nella tua squadra. Si può sostenere che NOLOCK era necessario in SQLServer 2000 a causa del suo modello di blocco meno che robusto, ma a partire da SQLServer2005 non c'è quasi nessun bisogno di farlo. Cerca in ALTER DATABASE mydatabase SET READ_COMMITTED_SNAPSHOT ON. – ripvlan

8

SQL Server 2008 ha diversi modi per identificare i processi e le query coinvolti nella situazione di stallo.

  1. Se deadlock sono facili da riprodurre, la frequenza è più alta e si può profilo del server SQL (si ha l'accesso e il costo delle prestazioni sul server quando profiler è abilitato) utilizzando SQL Profiler vi darà bella vista grafica di stallo. Questa pagina ha tutte le informazioni necessarie per utilizzare i grafici deadlock http://sqlmag.com/database-performance-tuning/gathering-deadlock-information-deadlock-graph

  2. maggior parte delle volte che riproducono situazioni di stallo è difficile, o che avvengono in ambiente di produzione in cui noi non vogliamo collegare Profiler ad esso e influire sulle prestazioni.

Vorrei usare questa query per ottenere deadlock successo:

SELECT 
    xed.value('@timestamp', 'datetime') as Creation_Date, 
    xed.query('.') AS Extend_Event 
FROM 
(
    SELECT CAST([target_data] AS XML) AS Target_Data 
    FROM sys.dm_xe_session_targets AS xt 
    INNER JOIN sys.dm_xe_sessions AS xs 
    ON xs.address = xt.event_session_address 
    WHERE xs.name = N'system_health' 
    AND xt.target_name = N'ring_buffer' 
) AS XML_Data 
CROSS APPLY Target_Data.nodes('RingBufferTarget/event[@name="xml_deadlock_report"]') AS XEventData(xed) 
ORDER BY Creation_Date DESC 

non voglio andare nella direzione di utilizzare (NOLOCK) per fissare i deadlock. Questa è una pendenza scivolosa e nasconde il problema originale.

Problemi correlati