데드락을 해결하기 위한 시도들

 그렇다면 데드락을 해결하기 위해서는 어떠한 시도들을 할 수 있는가 살펴보기로 하죠.

아까 데드락을 설명하면서 사용한 비유가 있었습니다. 이 경우 갑돌이와 차돌이의

상황을 어떻게 하면 말릴 수 있을까요. 첫번째는 두 사람이 언제까지만 싸우겠다는

시간을 정하는 것입니다. 20초 안으로 결정을 보자고 합의하는 것입니다.

두 번째는 둘 중의 하나의 힘이 더 센 경우입니다. 갑돌이가 더 힘이 세다면 차돌이

것을 빼앗아버리게 되겠죠. 차돌이에게는 안된 일이지만, 상황은 종료됩니다.

세 번째는 둘이 싸우는데 다른 한명이 나타나서 둘 모두를 패던가 한명을 패서

강제로 결정을 보는 것입니다.

 

첫번째 해결방법은 락 타임 아웃(Set Lock Timeout)으로 설정됩니다.

커넥션 레벨에서 설정되는 락 타임 아웃은 락이 대기하는 타임아웃 시간을 설정하여

해당 시간이 지나간 경우에는 해당 트랜잭션에 에러를 내고 롤백 시킵니다.

옵션 값은 밀리 세컨드(milliseconds) 단위로 설정됩니다. 예를 들어서 아래 코드는

10초로 락 타임 아웃 시간을 설정하는 것입니다.

 

 

 

-- 락 타임아웃 설정 만일 1인 경우에는 무한대

SET LOCK_TIMEOUT 10000

 

-- 락 타임아웃 확인

SELECT @@LOCK_TIMEOUT

 

-- 트랜잭션 코드 추가

 

<리스트 3> 락 타임아웃 설정

 

두 번째 방법은 해당 트랜잭션에 우선 순위를 둠으로써 만일 데드락 상황이 발생했을

시에 우선 순위가 낮은 트랜잭션을 먼저 취소 시키는 것입니다.

이는 SET DEADLOCK_PRIORITY라는 옵션 설정문에 의해서 LOW 및 NORMAL로 설정되게

되는데, LOW로 설정된 해당 트랜잭션은 다른 트랜잭션에 비해서 먼저 취소되게 되며

이렇게 취소되는 트랜잭션을 데드락 희생자(Deadlock victim)이라고 부릅니다.

 

 

SET DEADLOCK_PRIORITY LOW

go

... 트랜잭션 구문

 

 

마지막 구문은 정말 가장 마지막 방법으로 데드락 혹은 블러킹이 너무 오랜 시간 동안

수행중이라고 의심되는 프로세스를 강제로 종료시키는 방법입니다.

SQL 명령어인 KILL 명령어를 사용하게 됩니다. 윈도 2000의 작업 관리자에서

오동작하는 프로세스를 강제로 종료 시키거나 커맨드라인에서 윈도 리소스 키트에

있는 KILL 유틸리티를 사용하는 것 처럼 데이터베이스에서도 프로세스를 종료 시킬 때는

이러한 KILL 명령어를 이용할 수 있습니다.

 

프로세스를 종료하기 위해서 가장 간단한 방식은 엔터프라이즈 매니저에서 작업 하는

것입니다. 엔터프라이즈 매니저를 열고 관리 카테고리에서

[현재 동작]-[잠금/프로세스 ID] 카테고리를 보면 현재 동작중인 프로세스들을 보실

수가 있습니다. 어떤 프로세스들은 너무 빨리 종료되기 때문에 최신의 프로세스들을

보기 위해서는 화면을 자주 갱신시켜주셔야만 합니다. 이 프로세스들 중에 의심 가는

프로세스 아이디를 클릭하면 아래와 같은 화면이 나옵니다.

 

  <그림 8> 프로세스 종료 시키기

 

등록 정보에서는 해당 트랜잭션이 가장 마지막에 수행한 T-SQL 명령어가 나타납니다.

이는 트랜잭션의 전체 명령어를 포함하지 않음으로 주의해서 수행하기 바랍니다.

오른쪽 위에서 두 번째 버튼인 프로세스 중지 버튼을 클릭하면 해당 트랜잭션이

취소됩니다. 물론 이 작업을 쿼리 분석기 상에서 KILL 51과 같이 명령어를 통해서도

수행할 수 있으며, 락 정보는 sp_lock, sp_who와 같은 시스템 저장 프로시저나

sysprocesses와 같은 시스템 테이블을 검색하여 보실 수도 있습니다.

물론 엔터프라이즈 매니저와 같은 편리함은 제공하지 못합니다만, 좀더 유연성 있게

작업하실 수 있을 겁니다.

Posted by gala
l