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

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

데드락 줄이기

 데드락 줄이기는 곧바로 락이나 블러킹을 줄이겠다는 의미로 해석해도 상관없습니다.

위에서 데드락들을 처리하는 것은 데드락이 발생한 사후 조치들로 SQL 서버에서

처리하여주는 것들입니다. 하지만 미리 애플리케이션 설계시에 데드락이나 락 발생을

줄여주도록 설계한다면 데이터베이스를 이용하는 애플리케이션의 성능을 보다

향상시킬 수가 있습니다.

 

첫번째로 데이터베이스 개체에 액세스하는 순서가 동일하면 락킹이 발생할 확률이

줄어듭니다. 위에서 데드락 상황으로 예를 들었던 그림5를 참고하여 생각하시기

바랍니다. 그때 데드락이 발생했던 이유는 트랜잭션 1과 트랜잭션 2의 개체에 대한

액세스 순서가 서로 엇갈렸기 때문이었습니다. 만일 트랜잭션 1과 트랜잭션 2가

동일한 액세스 순서를 이용했었다면 트랜잭션 2는 트랜잭션 1이 자원 1과 2를 모두

사용하고 커밋한 후에 해당 자원들을 이용할 수 있었을 것입니다. 이렇게 어떤 것을

먼저 액세스해야만 하느냐도 데드락 발생의 중요한 요인이 됩니다.

 

두 번째는 트랜잭션이 보다 짧으면 짧을 수록 락 발생 확률도 줄어듧니다. 이는 자원에

대한 락킹 시간을 줄여 주므로 동일 개체에 대한 액세스가 되도록 이면 일어나지

않도록 해줄 것입니다. 특히 트랜잭션 중에 사용자의 입력을 묻거나 수행 시간이

상당히 긴 작업을 수행한다면 전체 트랜잭션 수행 시간과 자원에 대한 락킹 시간이

길어지므로 데드락이 보다 자주 발생할 수 있습니다.

 

세 번째는 보다 낮은 격리 수준을 이용하라는 것입니다. 여기서는 트랜잭션의 격리수준에

대해서는 설명하지 않았지만, 트랜잭션 격리 수준이 높아지면 데이터의 안전성은 높아지지만

성능은 떨어질 수 있고 격리 수준이 낮아지면 데이터의 안전성은 낮아지지만

성능은 보다 향상될 수 있습니다. 되도록 낮은 격리 수준을 사용하면 데드락이 발생할

가능성이 낮아지게 됩니다. 격리수준에는 커밋되지 않은 읽기(Read Uncommitted),

커밋된 읽기(Read Committed), 반복 읽기(Repeatable Read), 순차 가능(Serializable)이

있으며 커밋된 읽기가 기본 값입니다.

 

이외에도 커서를 이용하면 데이터베이스의 동시 사용능력이 떨어질 수 있고, 이는

락을 많이 발생시킨다는 말입니다. 그리고 T-SQL 문이 되도록이면 검색 인자(SARG),

즉 인덱스를 사용하도록 조절합니다. 예를 들어서 테이블에 클러스터드 인덱스를

생성한다거나, UPDATE, DELETE 문이 인덱스를 이용하여 작동되도록 한다거나

하게 되면 데드락이 발생할 가능성이 보다 줄어듧니다.(여기에는 여타의 다른 이유들도

있겠지만, 검색 인자를 이용하는 T-SQL 문이 그렇지 않은 T-SQL 문 보다 빠르게

수행된다는 데에 기인합니다.)

 

데드락을 줄여주거나 찾는 데에는 정말로 수많은 방법들이 있습니다. 가장 기본적인

사항들은 트랜잭션의 크기를 보다 적게 하고 락을 유지하는 시간을 보다 짧게 해주도록

하는 것입니다. 데드락이 발생한 후에 SQL 서버가 데드락의 영향을 줄여주도록

락 타임아웃이나 데드락 우선 순위를 이용하여 처리하고 있지만, 이러한 것은

데이터베이스를 이용하는 해당 애플리케이션에는 그다지 좋은 처리 방안이 아닐

것입니다. 왜냐면 취소된 트랜잭션을 재실행하는 로직들을 포함해야만 하기 때문이죠.

취소된 트랜잭션은 데드락 상황을 해결했다고 해서 끝나는 일이 아니지 않습니까?

만일 그 트랜잭션이 회원 가입이나 주문과 같은 중요한 상황일 경우에는 더욱 그러하겠죠.

 

맺음말

 이번 컬럼을 통해서 여러분이 SQL 서버의 데드락을 이해할 수 있었기를 바랍니다.

얼마전에 어떤 분이 이런 얘기를 하더군요. 인생이란 하나의 큰 강물과 같아서 많은

사람들은 비슷 비슷한 길들을 가게 된다. 하지만, 사람의 인생이란 그렇게 똑같지만은

않은 게, 그 강물에는 곳곳에 소용돌이도 있고, 흐름이 역류하고 있는 곳도 있고,

시내로 흘러가 강물이 끝나는 곳도 있는데, 많은 사람들이 거기에서 헤매고 절망하고,

힘내서 벗어나게 되는 거다 라고 말합디다. 어떤 일이든 공부든지 계속하다보면 어렵거나

힘들때가 많이 있죠. 이럴때 조금만 더 하시면 보다 큰 강물로 나갈수 있다고 생각하면

자신감 있게 나가시길 바랍니다.

 

끝으로, 이 컬럼에서 다뤘으면 하는 주제나 아니면 FAQ에 물어보고 싶은 내용들을

아래의 메일 주소로 보내주시기 바랍니다.

Posted by gala
l