티스토리 뷰

데이터베이스 격리수준을 알아보려고 한다. 격리수준은 트랜잭션에서 일관된 데이터를 허용하는 수준을 의미한다. 

격리수준을 높이면 데이터베이스에 대한 요청에 대해 병렬적 처리가 아닌, 순차적으로 처리하게 되기 때문에 일관된 데이터를 보장할 수 있겠지만, 클라이언트 요청에 대한 

응답이 늦어질 수 있는 단점이 있다. 그렇다고 격리수준을 낮추면 병렬적으로 처리가 가능하기 때문에 속도는 향상될 수 있겠지만, 일관된 데이터를 보장할 수 없다.

개인적으로 데이터베이스를 사용할 때, 일관된 데이터 제공이 최우선, 그다음이 성능이라고 생각한다. 그렇다고 성능을 완전 무시할 수 는 없을 것이다.


Isolation Level


 (1) Read UnCommitted (LV 0)

 트랜잭션에서 커밋되지 않는 데이터를 다른 트랜잭션에서 읽는 것을 허용하는 단계이다. LV 0에서는 Dirty Read 가 발생할 수 있다.

 트랜잭션에서 완료되지 않는 데이터를 다른 트랜잭션에서 조회를 할 때, 데이터의 일관성이 깨지는 현상이다. 만약 A라는 트랜잭션이 데이터를 수정하였고, 수정한 결과를 

 커밋하지 않는 상태에서 B가 조회를 하고, A각 롤백한다면..? 결국은 B는 잘못된 데이터를 조회한 것이 된다!


 (2) Read Committed (LV 1)

 트랜잭션에서 커밋된 데이터만을 다른 트랜잭션이 허용하는 단계이다. 만약 트랜잭션 B가 커밋되지 않는 트랜잭션 A의 데이터를 조회한다고 했을 때, 트랜잭션 A가 

 현재 작업하고 있는 테이블에서 데이터를 조회하는게 아니라, UNDO 테이블이라는 트랜잭션 작업 이전의 데이터를 담고 있는 테이블을 통해 조회를 하기 때문에 항상 

 커밋된 데이터만을 조회할 수 있다. 하지만 LV 1에서는 Non-Repeatable Read가 발생할 수 있다. 

 한 트랜잭션에서 같은 쿼리를 두번 이상 조회할 때, 그 사이에 조회대상인 트랜잭션이 값을 수정/삭제하고 커밋했을 때, 다른 결과를 확인할 때 발생하는 현상이다.

 한 트랜잭션 안에서 커밋 전에는 UNDO 테이블에서의 조회를, 커밋 이후에는 해당 테이블에서 조회를 하기 때문에 그 데이터가 상이하게 나올 수 있다.


 (3) Repeatable Read (LV 2)

 트랜잭션 범위 내에서 조회하는 모든 데이터를 동일한 데이터를 보장한다. 트랜잭션은 각각 트랜잭션 번호가 존재하며, 이 번호는 순차적으로 증가하는 방식이다.

 그렇기 때문에 트랜잭션 B(트랜잭션 번호 : 11)가 트랜잭션 A(트랜잭션 번호 10)의 데이터를 조회하여 C라는 정보를 얻었고, 트랜잭션 B가 종료되지 않는 시점에서 A가 커밋을 

 하게되면 A의 트랜잭션 번호는 12가 되며, 트랜잭션 B는 다시 조회를 하면 자신의 트랜잭션 번호보다 낮은 정보만을 조회하기 때문에 UNDO 테이블을 통해 조회를 하고, 

 C라는 정보를 얻는다. 결국은 Non-Repeatable Read 해결가능하다. 하지만 Phantom Read 문제는 발생한다. 한 트랜잭션 안에서 레코드를 두번이상 읽을 때, 첫번째 

 결과에서 없던 레코드가 두번째 결과에서 확인되는 현상이다. Repeatable Read는 수정에 대해서만 처리를 하기 때문에 삽입을 막지를 못한다.


 (4) Serializable (LV 3)

 트랜잭션 범위 내에서 조회하는 데이터의 완전한 일관성있는 데이터를 보장한다. 앞서 나온 모든 문제를 해결한 방식이다. 

'면접 질문' 카테고리의 다른 글

[면접준비] JDBC  (0) 2019.03.18
[면접준비] 파티셔닝  (0) 2019.03.18
[면접준비] REST 장, 단점  (0) 2019.03.18
[면접준비] 스프링에서 사용되는 디자인패턴  (0) 2019.03.17
[면접준비] MVC Model1, Model2  (0) 2019.03.16
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함