'Programer Story/DB Stroy'에 해당되는 글 22건

  1. 2007.01.08 데드락 (Dead Rock) -4 by gala

데드락 시뮬레이션

 실제로 데드락 상황을 만들어보기로 합시다. 아래 리스트2는 매우 간단한 트랜잭션

두 가지를 이용해서 데드락 상황을 시뮬레이션하고 있습니다. 사용할 개체들은

MyDLock1과 MyDLock2 테이블이며, 쿼리 분석기를 열어서 두개의 커넥션을

열어서 각 커넥션의 코드들을 순차적으로 수행해야만 합니다.

 

리스트2에서 커넥션 1은 우선 MyDLock1 테이블에 대해서 데이터를 삽입함에 의해서

배타적 락을 MyDLock1 테이블에 설정하게 됩니다. 이때 커넥션 2에서는

MyDLock2 테이블에 동일한 작업을 수행해서 해당 개체에 배타적 락을 설정합니다.

그 다음 단계는 자신에 락을 설정하지 않은 개체들에 대해서 액세스를 요청하는

일입니다. 커넥션 1은 MyDLock2 테이블에 대해서 배타적 락을 사용하여 액세스하기를

요청하게 됩니다. 일반적으로 SELECT문의 경우에는 공유 락으로 트랜잭션이

완료되지 않더라도 락을 해제할 수 있지만 여기서는 락 힌트(Lock Hint)를

사용해서 강제로 배타적 락을 사용하도록 하였습니다. 커넥션 2도 마찬가지입니다.

 

 

커넥션1

 

 

커넥션 2

 

-- 데이터베이스를 선택한다.

USE NORTHWIND

go

 

-- 테스트 테이블을 생성한다.

CREATE TABLE MyDLock1

(

  id INT PRIMARY KEY,

  value VARCHAR(30)

)

go

 

-- 테스트 데이터를 추가한다.

INSERT MyDLock1 VALUES(1,'DATA1')

go

 

-- 데이터베이스를 선택한다.

USE NORTHWIND

go

 

-- 테스트 테이블을 생성한다.

CREATE TABLE MyDLock2

(

  id INT PRIMARY KEY,

  value VARCHAR(30)

)

go

 

-- 테스트 데이터를 추가한다.

INSERT MyDLock2 VALUES(1,'DATA1')

go

 

 

BEGIN TRAN TRAN1

 INSERT MyDLock1 VALUES(2,'DATA2')

 

 

BEGIN TRAN TRAN2

 INSERT MyDLock2 VALUES(2,'DATA2')

 

SELECT * FROM MyDLock2 WITH(TABLOCKX)

 

 

SELECT * FROM MyDLock1 WITH(TABLOCKX)

 

 

ROLLBACK TRAN TRAN2

 

<리스트 2> 데드락 시뮬레이션

 

아래 그림6을 보면 데드락 상황을 확인 할 수 있습니다.

양쪽 커넥션 모두에서 아래 상태 줄을 살펴보면 지구모양의 아이콘이 돌아가고 있음을

볼 수 있을 것입니다. 이는 각 커넥션이 대기 상태임을 나타내는 것으로 두 커넥션 모두

대기 상태에 빠져있는 데드락임을 알 수 있습니다.

<그림 6> 데드락 상황

 

이러한 데드락 상황은 오래 가지 않고 아래 그림7과 같은 결과를 보여주며 종료됩니다.

데드락 현상이 하나도 발생하지 않는 데이터베이스 제품이 없다고 해서, 데이터베이스가

그렇게 데드락 상황에 무관심한 것은 아니죠. 몇 가지 방법들을 제공하고 있으므로

그 부분은 다음에서 다루기로 하겠습니다.

<그림 7> 데드락 종료

Posted by gala
l