[기술면접] 데이터베이스 : (격리 수준, 동시성 제어, 인덱스)

Alice·2023년 8월 23일
0

인덱스란 무엇일까?

인덱스란 데이터베이스 테이블의 검색 속도를 향상시키기 위한 색인 자료구조이다. 테이블의 모든 데이터를 검색한다면 많은 시간이 소요되고, 데이터의 위치를 포함하는 자료구조를 통해 이 과정을 돕고있다. 인덱스가 사용되지 않는 탐색은 Full Scan 이라고 하는데, 이는 처리 속도가 떨어지는 탐색과정이다.


인덱스의 자료구조는 2 타입으로 나뉜다.

해시 테이블 구조는 컬럼의 값으로 생성된 해시 값을 기반으로 인덱스를 구현한다. 시간복잡도는 O(1) 이라 검색 속도가 매우 빠르다. 하지만 < , > 와 같은 연속적인 데이터를 위한 순차 검색이 불가능하다.


B+ Tree 는 자식 노드가 2개인 B Tree 를 개선시킨 자료구조이다. B Tree 의 리프노드들을 링크드리스트로 연결하여 순차 검색을 용이하게 한다. 해시 테이블보다 검색속도가 느린 O(nlogn) 이지만, 해시 테이블보다 많이 사용되는 방식이다.







트랜잭션 동시성 제어

동시성 제어란 동시에 실행되는 트랜잭션이 성공적으로 실행될 수 있도록, 트랜잭션의 순서를 제어(트랜잭션의 직렬성을 보장) 하는 기법이다.


Locking 기법

트랜잭션이 데이터에 락을 설정하면, 다른 트랜잭션들은 해당 데이터들이 언락 될때까지 수정이나 삭제가 불가능하게 설정하는 방법으로 직렬성을 보장하는 기법이다.


TimeStamp 기법

트랜잭션에 타임 스탬프를 부여함으로써, 트랜잭션의 접근 순서를 미리 정해두는 방법으로 직렬성을 보장하는 기법이다.



데드락(교착상태)은 무엇인가?


데드락, 혹은 교착상태라고 불리는 이 상태는 두 개 이상의 프로세스가 서로가 점유하는 자원을 기다리면서 생기는 무한 대기 상황이다. 즉, 두 트랜잭션이 락을 사용하고 서로의 락에 접근하여 생기는 교착 문제이다.


데드락 감지 기법

Wait-for-graph 기법은 교착상태를 감지 하는 기법 중 하나이다. 이 기법은 트랜잭션과 락을 기반으로 그래프를 그린다. 그려진 그래프가 사이클을 형성하면 교착상태에 빠졌음을 알 수 있다. 이는 작은 데이터베이스에 이용하기 수월한 방식이다.


데드락 회피 기법

Wait-Die 방식에서는 자원을 요구하는 프로세스의 트랜잭션이 상대적으로 최신인 경우 자원을 요구하는 프로세스의 트랜잭션을 Kill 한다. 이후 동일 Time Stamp 로 재시도한다. 반면 자원을 요구하는 프로세스의 트랜잭션이 더 오래된 경우 자원 점유가 끝나기를 기다린다. 즉, 오래된 트랜잭션이 최신 트랜잭션을 기다리는 방식이다.


Wound-Wait 방식에서는 자원을 요구하는 프로세스의 트랜잭션이 상대적으로 최신인 경우 자원을 가진 프로세스의 트랜잭션을 Kill 한다. Kill 당한 프로세스는 동일한 Time Stamp 를 가지고 재시도한다. 반면 자원을 요구하는 프로세스의 트랜잭션이 더 오래된 경우 자원 점유가 끝나기를 기다린다. 즉, 최신 트랜잭션이 오래된 트랜잭션을 상처입히는(Wound) 방식이다.






트랜잭션의 Isolation Level


Isolation Level 은 트랜잭션의 ACID 를 보장하기 위해서 사용된다. 의 사용으로 이를 해결할 수 있지만, 무분별한 락의 사용은 성능의 저하를 초래한다. 반대로 느슨한 락은 데이터 무결성에 문제를 발생시킨다. 따라서 효율적인 락의 사용을 위해 Isolation Level 은 반드시 필요하다.


Level 0 : Read Uncommited

어떤 트랜잭션의 내용이 commit 이나 rollback 의 유무와 상관없이 다른 트랜잭션에서 조회가 가능하다. 정합성의 문제가 많은 격리이기에, RDBMS 에서는 격리 수준으로 인정하지 않는다.

Level 0에서는 Dirty Read 가 발생한다. 이는 아직 커밋되지 않은 다른 트랜잭션의 데이터를 조회하는 문제를 의미한다. 아직 commit 되지 않은 변동사항을 조회하였는데, 해당 트랜잭션이 rollback 된다면 파급 문제가 발생하는 것이다.


Level 1 : Read Commited

한 트랜잭션의 내용이 commit 되어야 다른 트랜잭션에서 조회가 가능하다. Oracle 등 대부분의 RDBMS 에서 기본적으로 사용하는 격리수준이다.

하지만 하나의 트랜잭션에서 똑같은 Select 문을 실행시키는 경우 항상 같은 결과가 나타나지않는 Non-Repeatable Read 현상이 발생한다. 아직 트랜잭션이 끝나지 않았는데, 다른 트랜잭션에서 commit 된 변동사항을 조회할 수 있기 때문이다.


Level 2 : Repeatable Read

MySQL 에서 기본적으로 사용되는 Isolation Level 으로, Non-Repeatable Read 현상이 발생하지 않는다. 해당 트랜잭션이 시작하기 이전에 commit 된 변동사항만 적용되기 때문이다.

하지만 트랜잭션의 시간이 길어질수록 계속 멀티버전을 관리해야하는 단점이있다. 또한 Phantom Read 가 발생할 수 있다. Phantom Read 는 같은 쿼리를 두 번 이상 실행했을 때 없던 데이터가 나타나는 현상으로, 데이터의 삽입 상황에서 발생하고는 한다.


Level 3 : Serializable

가장 단순하면서도 엄격한 격리수준으로, Phantom Read 가 발생하지 않는다. 하지만 성능 측면에서는 동시 처리 성능이 가장 낮다. 트랜잭션이 동시에 실행되지 않고, 순차 실행되는것 처럼 동작한다. 따라서 잘 사용되지 않는다.

profile
SSAFY 11th

0개의 댓글