본문 바로가기
컴퓨터공학/데이터베이스(database)

[Concurrency Control]Multiple Granularity Locking

by 바코94 2020. 6. 1.

락을 거는 단위에 대해서 살펴보자. 아이템에 락을 걸 때 단위가 다양하다. 즉, DB가 계층적으로 구성되어 있다고 하면 락을 걸게 되었을 때 노드의 자식 노드에 대해서도 동일한 락을 건다는 뜻을 담는다. 

계층적 구조에서 root에 X락을 걸었다면 모든 하위 노드에도 X락을 걸게된다.

또한 root가 아닌 하위 노드에서 X락을 걸려면 부모부터 root까지 IX락이 걸려있어야 한다.

 

학생 테이블에서 평균값을 구하는 상황을 생각해보자.

단위를 레코드 처럼 작게 설정하면 트랜잭션에서 락을 걸 때 concurrency가 높다. 하지만 모든 학생 레코드를 읽으려면 오버헤드가 크다.

단위를 테이블 처럼 크게 설정하면 락을 걸 때 테이블에 대해서만 락을 걸면 된다. 학생들의 평균 값을 구할 때 테이블에 락을 걸면 오버헤드가 적을 것이다. 하지만, 다른 트랜잭션이 이 테이블에 락을 못 걸기 때문에 concurrency는 떨어진다.

 

작은 단위를 쓰는 경우에는 concurrency를 높일 수 있지만 오버헤드가 크다.

multiple granularity locking은 이 단위를 다양하게 하는 방식이다.

 

Intention lock

계층적 구조에서 intension lock을 건다는 것은 하위 노드에 대해서도 락을 걸겠다는 얘기이다. 미래에 하위 노드에게 s lock이나 x lock을 걸겠다는 것이다. 

 

3 가지 종류가 있다.

IS, IX, SIX

 

r221에 X락을 걸기 위해서는 조상 노드들에 대해서 IX락을 걸어야 한다. 이렇게 하면 어떤 트랜잭션이 DB에 락을 걸고 싶을 때 하위에 충돌하는 연산이 있는지 확인하지 않아도 된다. 따라서, p22, R2, DB에 IX락이 걸린다.

 

IS는 하위에 있는 노드에 대해서 S락을 걸겠다는 것을 의미한다.

IX는 하위에 있는 노드에 대해서 S or X락을 걸겠다는 의미이다.

SIX 락은 현재 노드에 대해서는 S락을 걸고 하위 노드에 대해서는 S or  X 락을 걸겠다는 의미이다.

 

그렇다면 compatibility matrix는 어떻게 될까

 

compatibility matrix with intention lock modes

 

IS 와 IX를 살펴보자. 

IS는 현재 노드를 기준으로 하위 노드에 S 락을 미래에 걸 것이다.

IX는 현재 노드를 기준으로 하위 노드에 S락이나 X락을 미래에 걸 것이다.

하위 노드에는 많은 노드가 있을 수 있는데 중요한 것은 IS와 IX에 대한 compatibility check는 현재 노드에 대해서 이루어 지는 것이다. 앞으로 걸게될 락이 어쨌든 간에 현재 노드에서는 충돌이 일어나지 않기 때문에 compatible하다. 미래에 일어날 하위 노드에서 발생할 수 있는 충돌 가능성을 생각해보면 IS에서 선택한 하위 노드와 IX 에서 선택한 하위 노드가 같고 IX에서 X락을 걸려고 할 때 발생할 것이다. 

 

IS와 X를 살펴보자.

IS는 현재 노드를 기준으로 하위 노드에 S락을 미래에 걸 것이라는 뜻이다.

X는 현재노드에 X락을 걸고 하위 노드에도 X락을 다 건다는 것이다.

따라서 하위 노드에 S락을 걸려고 되면 이미 X락이 걸려있기 때문에 충돌한다.

 

요약하면 lock compatibility matrix를 사용하면 되고 어떤 락을 걸기 위해서는 root에 락을 걸어야 해야만 한다. 

또 어떤 노드에 락을 걸려면 부모 노드에 intention lock이 걸려있어서 그 조건이 맞아야 한다.

2-phase 로 동일하게 진행되며 unlock시에는 하위 노드에서 부터 언락해야한다.

 

 

예시를 살펴보자.

example1

 

락 과정에서 충돌 연산이 없다.

 

example2

 

 

example3