티스토리 뷰

반응형

지난번에 vb에서 RecordSet에 타임아웃을

거는 예제에 대해서 설명한 바 있다.

2009/06/02 - [VB 6.0] - [vb 6.0] ADO - RecordSet 타임아웃 속성 걸기 - Connection 응용

(위 링크 참고 읽다보면 중간에 나옴)

그런데 혹시 위 포스트를 읽는 도중

블락킹, 라이브락, 데드락과 같은 용어의

개념이 헷갈리진 않았는지 모르겠다.

나같은 경우는 이 개념이 너무 헷갈려서

여기저기 검색에,  MS Sql튜닝가이드북.... DBA가이드.... 등등을

찾아봤으나 아무래도 개념이 안잡혀서 고생했었던 기억이 있다.

일상에서 빈번히 일어나는 일들이지만, 그렇다고 검색을 해도 잘 나오지 않는.....



또 누군가
 
"블락킹, 라이브락, 데드락 이란 이거다~~!!!!"



라고 속 시원하게 알려주면 좋겠지만

쉽게는 찾을 수 없는 이 답답하기 짝이 없는 개념들에 대해서 숙연한 마음으로...

딱 내가 알고 이해한 만큼만 설명을 해 보고자 한다. ㅎㅎㅎ













그럼 설명하기에 앞서 먼저 짚고 넘어가야 할 것들이 있다.

이걸 잘~~ 생각해야 안 헷갈리니 확실히 하도록 하자.




Lock

잠금이 발생한 상황


Blocking

잠금을 발생시킨 프로세스간 차단행위





위의 얘기가 무슨얘긴지 아직은 잘 이해가 되지 않더라도

일단은 이렇게 이해하고 넘어가면 되겠다.



.
.



그럼 먼저 라이브락(LiveLock)에 대한 상황을 설정해 보도록 하겠다.

아래는 위키디피아에 나와있는 Livelock에 대한 설명되시겠다.


Livelock

A livelock is similar to a deadlock, except that the states of the processes involved in the livelock constantly change with regard to one another, none progressing.[2] Livelock is a special case of resource starvation; the general definition only states that a specific process is not progressing.[3]

A real-world example of livelock occurs when two people meet in a narrow corridor, and each tries to be polite by moving aside to let the other pass, but they end up swaying from side to side without making any progress because they both repeatedly move the same way at the same time.

Livelock is a risk with some algorithms that detect and recover from deadlock. If more than one process takes action, the deadlock detection algorithm can repeatedly trigger. This can be avoided by ensuring that only one process (chosen randomly or by priority) takes action.[4]



음.... 중간단락에 실생활에 적용되는 예를 적어놓았다. 이해에 도움이 되니 찬찬히 살펴보자.

두번째 단락은 간단히 말하자면 이런 상황이다.

A, B 두 사람이 골목길에서 마주쳤다.

그런데 누군가 한명은 옆으로 비켜줘야 지나갈 수 있는 좁은 골목이기 때문에

A가 비켜줬는데 B도 동일한 방향으로 움직이는 거다.

그래서 A가 다시 다른쪽으로 피하자 이번에도 B가 같은방향으로 움직이는 경우

결국 A와B는 동일한 방향으로 피해주다가 둘다 진행이 불가능하게 되는 경우이다.

이런 경우를 라이브락이라고 한다.

누구나 실제로도 이런 경우를 한번쯤은 겪어 봤을거라고 생각한다.

그럼 이 경우 해결책은?

아주 간단하다. A가 됐든 B가 됐든 누군가 먼저 지나가면 된다.



이 상황을 Sql에 적용해서 얘기 해 본다면



트랜잭션1 이 table1에 잠금을 걸었다고 상황을 만들고
 
select가 됐든 update가 됐든 트랜잭션2가 table에 접근을 시도한다고 가정해보자.



※ 주의. 아래 예시를 따라서 해 볼 경우, 실제 DB로 하지 마십시요. 테스트용으로 하시기 바랍니다.


1. 쿼리 분석기에 창을 두개 띄우고 창을 세로바둑판식 배열로 맞춰준다.

2. 가상테이블을 하나 만들고 그 안에 데이터를 대충 몇개 넣어준다.

 

2. 왼쪽 창에서 트랜잭션을 걸어준다.(Commit이나 Rollback은 실행하지 않는다.)

3. 오른쪽 창에서 해당 임시테이블을 select 한다. 이때 오른쪽 창에서는 왼쪽창에서 걸어놓은 Lock때문에 Blocking(차단)을 당하게 되는데, 이 상태는 왼쪽 창에서 Commit 혹은 Rollback을 해 줄때 까지 무한정 대기상태에 돌입하게 된다. 이 상태가 바로 LiveLock(라이브락) 상태이다.

 
4. 라이브락 상태를 빠져 나오기 위해서는 잠금을 건 창(왼쪽)에서 Commit 혹은 Rollback을 해 주면된다.

5. 왼쪽창에서 Rollback을 실행하자 마자 오른쪽 창에서 라이브락이 풀리며 select에 대한 결과가 출력됐다.




위 그림들과 설명을 보면 이해가 될 것이다. 그래도 잘 이해가 되지 않는다면

따라서 해 보면 뭐 거의 이해가 될 거라고 본다.

라이브락을 회피하기 위해서는 위에서 본 바와 같이

처음 잠금을 건 창의 트랜잭션의 길이가 짧을 수록 좋으며,

select * from table (readuncommitted)과 같이 옵션을 줘서 오른쪽 창의 잠금수준을 낮추는 방법이 있다.

readuncommitted를 함께 걸어주게 되면 실제 데이터가 아닌 버퍼에 있는 값을 읽어오게 되므로

라이브락을 회피 할 수가 있다.



내용이 또 무작정 길어지지만 DeadLock에 대한 설명을 하지 않을 수 없으니 간단하게

내용을 알아보도록 하겠다.


DeadLock

일단 잠금이라는 점에선 라이브락과 비슷하긴 한데, 요놈은 조금 더 고약한 놈이다.

라이브락이 외나무다리에서 마주친 두 프로세스라고 한다면

데드락은 하나의 상자에 들어있는 물건을 서로 가지려고 두 사람이 자기만의 자물쇠로

상자를 잠궈 버린 경우라고 할 수 있다. 상자 하나에 자물쇠 두개.. 뭐 그런거다.



다음 그림을 보도록 하자.



1. 역시 창을 두개 띄우고 세로 바둑판 배열로 나열한다.

2. 이번엔 가상 테이블을 두개를 준비한다.

3. 왼쪽 창에서는 (Update a, update b), 오른쪽 창에서는 (update b, update a)를 실행한다.

4. 라이브락과는 달리 데드락은 동시에 일어나야 하기 때문에    waitfor delay '00:00:05'

    구문을 사용해서 5초 딜레이를 주게된다.

5. 미묘한 차이로 DeadLock이 발생하는 결과를 확인한다.


일반적으로 데드락이 발생하는 원인 중의 하나가 트랜잭션이 교차로 걸리기 때문인데

위 그림에서 처럼 왼쪽은 a,b   오른쪽은 b,a  이런식이다.

데드락이 걸려버리게 되면 이를 해결하기 위해서 SQL서버입장에서는 어느 한쪽을 일방적으로

취소를 하는 수 밖에 없다. 그러나 이는 곧 서버의 성능저하로 이어지게 될 것이다.

이런 상황에서 데드락을 회피하는 최적화된 방법은 왼쪽, 오른쪽 둘다 일방통행을 만들어 주는 것이다.

즉 update a, update b의 순서를 맞춰주면 된다는 얘기다.

아래 그림을 보면 위에서 데드락이 발생했을 때와는 달리 양쪽에서 업데이트를

교차로 하지 않고 순차적으로 해줌으로써 데드락이 발생하지 않는 것을 확인 할 수 있다.










오늘도 길고도 험난했던 포스팅을 마치면서

앞으로 해야 할 일도 많고 알아야 할 것도 많다는 걸 새삼스럽게 또 느끼게 된다.

아..... 그리고 공복도.... ㅋㅋㅋㅋ

어제 먹었던 모밀이..... 으헣헣


아무튼 요약하자면

라이브락이란 외나무다리에서 만난 원수

데드락이란 유효자원을 서로 점유하기 위한 두 프로스세간의 전쟁

블락킹이란 락이 걸린 상황에서 먼저 자원을 점유한 프로세스가 다른 프로세스의 접근을 막는 행위


정도로 개념을 잡아놓으면 될 것이다.

 - 끗 -












본문과는 상관없는 오늘의 짤방 상상력을 키워보아요~~~♡





















조..좋은...

























 

반응형
댓글
반응형
12-03 08:04
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함