2009-04-06 9 views
14

내 웹 사이트가 많은 수의 방문자를 처리하지 못하는 것 같습니다. 서버가 너무 단순하기 때문입니다.Sql Server 2008 교착 상태 해결

내 웹 사이트 전에

2 시간 안타를 많이 받고 있었고, 난 3 교착 상태 오류가 발생한 것으로 나타났습니다 오류는 다음과 같습니다

System.Data.SqlClient.SqlException : 트랜잭션 (프로세스 ID 58) 다른 프로세스에서 잠금 리소스에 교착 상태가 발생하여 교착 상태 희생자로 선택되었습니다. 트랜잭션을 재실행하십시오.

왜 이런 일이 일어 났는지 확신 할 수 없습니다 ... 스택 추적을 살펴보면 선택 쿼리로이 문제가 발생했음을 알 수있었습니다.

누구든지이 오류의 원인을 알고 있습니다. 당신이 행 버전 관리가 활성화되지 않는 한

서버는 2008 년

+0

http://support.microsoft.com/?kbid=832524 * 위 링크의 이론은 여전히 ​​있지만 SQL Server Profiler의 문서에 대한 업데이트 링크가 있습니다. http://msdn.microsoft.com/en-us/library/ms188246.aspx – GregC

답변

6

쓰기가 차단 윈도우 2008 및 SQL Server를 실행는 SQL Server에서 읽습니다. sp_who2 저장 프로 시저와 SQL 프로필러 추적을 사용해야합니다. sp_who2은 어느 프로세스가 어떤 프로세스를 차단하고 있는지 알려주고, 프로파일 러는 블로킹 프로세스의 마지막 문장을 알려줍니다.

-3

더티 읽기에 신경 쓰지 않는다면 SELECT 쿼리에 테이블 이름 뒤에 (NOLOCK)을 넣을 수 있습니다. 여기서 실행중인 트랜잭션은 현재 실행중인 UPDATE 및 INSERT 문이 무시되므로 최신 데이터가 보장되지 않습니다.

일반적으로 대부분의 시스템은 업데이트/삽입보다 훨씬 많은 읽을 거리를 갖고 있지만, 분명히 응용 프로그램의 성격에 따라 다릅니다.

는 또한 2008 교착 상태에 관련된 프로세스와 쿼리를 식별 할 수있는 다양한 방법이있다 http://www.sql-server-performance.com/tips/deadlocks_p1.aspx

+4

Nolock은 "최신 데이터를 보장하지 않음"의 결과를 정확하게 * 이해하지 못하면 매우 나쁜 생각입니다. –

+1

나는 NOLOCK을 사용하여 반대를 강력히 권고한다. 나는 이것이 오래 된 포스트라는 것을 알지만, 나는 교착 상태에 대한 도움을 찾고있는이 (나는 그랬던 것처럼)을 우연히 발견하는 누군가에게 경고해야한다고 느낀다. 저는 개인적으로 NOLOCK의 악의에 의해 묘사 된 결과를 보았습니다 - 그리고 그들은 정리하기가 어렵습니다. 팀에서 NOLOCK이 습관이되도록 허용하지 마십시오. SQL Server 2000에서는 강력한 잠금 모델이 아니기 때문에 NOLOCK이 필요하다고 주장 할 수 있지만 SQLServer2005부터는 필요가 거의 없습니다. ALTER DATABASE mydatabase SET READ_COMMITTED_SNAPSHOT ON을 조사하십시오. – ripvlan

8

SQL 서버를 보라.

  1. 교착 상태를 재현하기 쉬운 경우, 주파수가 높고 당신에게 교착 상태의 좋은 그래픽보기를 줄 것이다 SQL 프로파일 러를 사용하여 (당신이 프로파일을 사용하는 서버에 대한 액세스 및 성능 비용이) SQL 서버를 프로파일 링 할 수 있습니다. 이 페이지에서는 교착 상태 그래프 http://sqlmag.com/database-performance-tuning/gathering-deadlock-information-deadlock-graph

  2. 교착 재생 시간의 대부분은 어렵다, 또는 우리가 그것을 프로파일을 첨부 할 및 성능에 영향을 해달라고 프로덕션 환경에서 발생 를 사용하는 데 필요한 모든 정보가 있습니다. 내가 교착 상태를 얻기 위해이 쿼리를 사용하는 것이

일이 : 나는 교착 상태를 해결하기 위해 (NOLOCK)를 사용하는 방향으로 갈 것

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 

. 그것은 미끄러운 슬로프이며 원래의 문제를 숨기고 있습니다.