SQL programming 
데드락이란 무엇인가?

데드락(Dead lock)은 복수의 쓰레드가 자신이 상대가 필요로 하는 리소스를 소유하면서 서로 상대가 소유한 리소스를 기다리고 있는 상황을 말한다. 이러한 상황에서는 계속해서 해제되지 않는 상대방 리소스를 기다리게 되어 결국 영원히 서로를 기다리게 된다. SQL Server는 이러한 Dead Lock 상황이 발생하면 해당 쓰레드들 중 가장 트랜잭션이 짧게 진행된 쓰레드 (즉, BEGIN TRAN 이후 Transaction Log가 좀 더 적게 쌓인 쪽)를 자동적으로 Kill하여 데드락 상황을 해소한다. 하지만, 데드락이 SQL Server 엔진에 의해 자동으로 해결된다고 하여 모든 해결되는 것은 아니다. 예를 들어, Production 시스템에서 데드락이 계속 발생하여 데이타를 저장하는 어떤 Stored Procedure가 계속 Kill 된다면, 결국 사용자 입장에서는 랜덤하게 간혹 데이타가 저장되지 않고 실패되는 상황을 경험하게 되는 것이다.





데드락을 분석하는 방법

데드락이 발생하면 SQL Server의 에러로그에 간단한 로그가 기록된다. 하지만, 이곳에는 어떤 SPID들끼리 데드락이 발생하여 그 중 하나를 Kill 했다는 정도의 내용만 기록되기 때문에, 정확히 어떤 SQL 문장들이 서로 충돌했는지를 파악할 수 없다. 데드락과 관련된 구체적인 내용을 분석하기 위해서는 SQL Profiler를 이용한다. 이를 위하여:
1) SQL Profiler를 실행
2) SQL Server에 연결
3) [Trace Properties] 다이얼로그에서 [TSQL-Locks] 템플릿을 선택

TSQL-locks

4) [Trace Properties] 다이얼로그에서 [Events Selecton] 탭을 선택한 후, 불필요한 이벤트들을 모두 체크박스에서 지우고, [Deadlock graph]를 선택.
5) 또한 추가로 특정 DB 이벤트만을 지정할 수 있다. [Events Selection] 그리드의 [Database Name] 컬럼 해더를 클릭하여 [Edit Filter] 다이얼로그 박스가 뜨면 Like안에 원하는 특정 DB명만을 지정하고 OK를 누른다.
6) 모든 설정이 끝났으면, [Run]을 누르면 Trace를 시작한다.

Deadlock event

데드락 그래프 (Deadlock Graph)

위의 SQL Profiler에 데드락이 잡히면, 데드락 그래프가 발생한다. 결과 그리드에서 [Deadlock graph]를 클릭하면 Trace 데이타를 분석하여 하단에 데드락이 발생했던 당시의 상황을 나타내는 그래프가 보여진다. 단순한 그래프의 경우는 보통 2개의 SPID가 2개의 리소스를 서로 교차하여 기다리는 형태이고, 복잡한 경우는 복수의 SPID들이 먹이사슬처럼 서로 복잡하게 얽혀 있는 형태를 가진다. 기본적으로 그래프를 보는 방법은, 우선 타원형으로 그려진 것이 작업쓰레드(SPID)를 나태내고, 사각형 박스가 리소스를 나태낸다. 화살표는 Owner와 Request로 표시되는데, Owner는 해당 SPID가 그 리소스를 소유하고 있을 것을 나타내고, Request는 해당 SPID가 그 리소스를 사용하도록 요청하고 기다리는 것을 나타낸다. Owner/Request에는 Owner Mode, Rquest Mode를 표시하는데, 이는 어떤 Lock 종류를 소유 혹은 요청하는지를 표시한다. Lock 종류는 여러 종류가 있지만, 기본적으로는 여러 쓰레드가 동시에 읽을 수 있는 S (Shared) Lock, 한 쓰레드만이 배타적으로 사용할 수 있는 X (Exclusive) Lock, 여러 쓰레드가 읽을 수 있게는 하지만, 나중에 해당 쓰레드만 Update할 수 있도록 미리 선점해 두는 U (Update) Lock 등이 있다. (보다 자세한 내용 MSDN의 SQL Lock 타입 참조). 또한 해당 리소스 사각형 박스 안에는 구체적으로 어떤 테이블의 어떤 Page 혹은 Row를 Lock 하고 있는지를 표시하고 있다. 타원형안에 파란색으로 X를 표시한 것은 해당 SPID가 SQL 엔진에 의해 Kill 되었음을 나타낸다. 데드락 그래프의 가장 유용한 정보중 하나는 데드락이 발생했을 당시 어떤 SQL 문장이 실행되고 있었으냐 하는 것이다. 이 정보는 타원형의 SPID에 마우스를 올려 놓으면 툴팁으로 표시된다. (팁: Profiler에서 File - Save As - Trace XML File을 선택하여 XML로 저장하면 보다 자세한 내용을 볼 수 있다) 단순한 데드락의 경우 두 SPID가 어떤 SQL문장들을 실행하고 있었고, 어떤 테이블에 어떤 Lock을 걸고 있었는지를 파악하면 쉽게 해결의 실마리를 찾을 수 있다.






본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.