2009-04-06 30 views
14

Mi sitio web no parece manejar un gran número de visitantes, creo que es porque el servidor es demasiado simple.Solución de problemas de interbloqueo en Sql Server 2008

hace 2 días mi página web estaba recibiendo muchos golpes y me di cuenta de que se produjeron 3 errores de punto muerto, el error es:

System.Data.SqlClient.SqlException : transacción (ID de proceso 58) se estancó en los recursos de bloqueo con otro proceso y se ha elegido como la víctima de interbloqueo. Vuelva a ejecutar la transacción.

No estoy seguro de por qué sucedió esto ... Mirando el rastro de la pila, pude ver que esto sucedió con una consulta de selección.

¿Alguien sabe cuál puede ser la causa de este error?

El servidor ejecuta Windows 2008 y SQL Server 2008.

+0

http://support.microsoft.com/?kbid=832524 * EDIT * aquí hay un enlace actualizado a los documentos del Analizador de SQL Server, aunque la teoría en el enlace anterior aún se mantiene. http://msdn.microsoft.com/en-us/library/ms188246.aspx – GregC

Respuesta

6

escrituras bloquearán lee en SQL Server, a menos que tenga habilitado versiones de filas. Debe usar el procedimiento almacenado sp_who2 y un rastreo de Analizador de SQL. sp_who2 le dirá qué procesos están bloqueando qué, y el generador de perfiles le dirá cuál fue la última declaración para el proceso de bloqueo.

-3

Si no te molesta leer sucio, puedes intentar poner (NOLOCK) después de los nombres de tu tabla en tus consultas SELECT. La compensación aquí es que no se garantizan los datos más actualizados ya que las sentencias UPDATE e INSERT que se están ejecutando actualmente se ignoran.

Por lo general, esto no es una gran explosión de trenes, ya que la mayoría de los sistemas leen mucho más de lo que actualizan/insertan, pero obviamente depende de la naturaleza de su aplicación.

Alternativamente echar un vistazo a http://www.sql-server-performance.com/tips/deadlocks_p1.aspx

+4

Nolock, sin * precisamente * comprender la consecuencia de "no se garantiza la información más actualizada" es una muy mala idea. –

+1

Lo recomiendo EN CONTRA de usar NOLOCK. Me doy cuenta de que esta es una publicación anterior, pero creo que debo ofrecer una advertencia a cualquiera que tropiece con esto (como yo lo hice) en busca de ayuda con los puntos muertos. Personalmente, he visto las consecuencias descritas por los males de NOLOCK, y son difíciles de limpiar. No permita que NOLOCK se convierta en un hábito en su equipo. Se puede argumentar que NOLOCK fue necesario en SQLServer 2000 debido a su modelo de bloqueo menos que robusto, pero a partir de SQLServer2005 hay poca o ninguna necesidad. Mire ALTER DATABASE mydatabase SET READ_COMMITTED_SNAPSHOT ON. – ripvlan

8

SQL Server 2008 tiene varias formas de identificar los procesos y consultas involucradas en un punto muerto.

  1. Si los puntos muertos son fáciles de reproducir, la frecuencia es más alta y se puede perfil de servidor SQL (que tiene el acceso y costo de rendimiento en el servidor cuando se habilita el generador de perfiles) utilizando el Analizador de SQL le dará bonita vista gráfica del punto muerto. Esta página no tiene toda la información que necesita para utilizar gráficos de punto muerto http://sqlmag.com/database-performance-tuning/gathering-deadlock-information-deadlock-graph

  2. mayoría de las veces que reproducen los puntos muertos es difícil, o que se produzcan en el entorno de producción donde no queremos adjuntar Profiler a la misma y afectar al rendimiento.

me gustaría utilizar esta consulta para obtener los puntos muertos ocurrió:

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 

yo no iría en la dirección de utilizar (NOLOCK) para fijar los puntos muertos. Esa es la pendiente resbaladiza y esconde el problema original.

Cuestiones relacionadas