데이터베이스의 교통 신호등
데이터베이스의 목적중에 가장 큰 것은 데이터의 공유라고 할 수 있다.
따라서 데이터베이스는 여러 사용자가 동시에 접근해서 데이터를 Insert , update , delete
할 수밖에 없다. 사거리 교통신호등이 없다고 생각해보자.. 아마 사방에서 차들이
제각기 주행하면서 아마도 충돌사고가 날 것이다. 데이터베이스도 마찬가지다. 여러 사용자가
동시에 데이터에 접근을 하기 때문에 사거리 교통신호등 처럼 교통정리를 안해주면 데이터는
정합성이 깨지면서 엉망이 될 것이다.
그래서 데이터베이스에서는 이러한 데이터에 대한 접근 즉 Transaction 에 대한 4원칙 즉
ACID를 따르도록 되어 있으며 이 ACID를 보장하기 위해서는 Isolation Level (격리수준) 을 결
정해서 적용해야 한다.
Transacton 이란?
트랜잭션(Transaction) 에 대한 개념 정의를 먼저 할 필요가 있다.
데이터베이스에서 트랙잰션(Transaction) 이란 데이터에 대한 하나의 논리적 실행 단계를
말한다. 좀 어려운 용어정의인데.. 예를 들자면 계좌이체를 생각해 보면 계좌이체는
A라는 송신자 통장에서 돈을 빼서 B라는 수신자의 통장에 돈을 넣는 2가지 단계로
이루어 지듯이 이 두단계에서 데이터에 대한 처리를 하는 논리적 행위를 트랜잭션
(Transaction) 이라고 한다.
그런데 만약 A송신자 통장에서 돈만 빠져나가고 B 수신자 통장에는 오류가 나서 돈이
안들어 왔다면 정말 큰일이다. 따라서 트랙잭션은 이 다음에 설명할 ACID 를 반드시
충족해야 한다.
데이터베이스의 읽기 이상 현상 (Read Phenomena)
데이터베이스에서 Isolation level 에 따라 발생할 수 있는 이상현상들을 정리해보면..
유형 | 내용 | 해결방안 |
Dirty Read | 트랜잭션 T1 에서 A = 5 로 Update 하고 아직 commit 를 않았는데 다른 트랜잭션 T2가 이 A 값을 읽을 수 있도록 허용하는 경우 Dirty Read가 발생 할수 있다. 즉. T1이 Update를 수행한 후 아직 commit 도 안했는데 다른 트랜잭션 T2가 A 를 select 했을 때 5 가 나올 경우 , T1 트랜잭션이 rollback을 했을 경우 결국 A 값은 5가 아님에도 T2 는 5로 잘못 읽는 (Dirty Read) 현상이 발생한다 | 공유 Lock 을 걸어서 T1이 A 에 접근하고 있는 동안 다른 트랜잭션이 접근하지 못하게 함. |
Non Repeatable Read | T1 트랜잭션이 같은 쿼리를 두번 실행했는데 그 결과값이 다른 경우, 즉 T1 이 select 를 두번 하는 사이에 T2 트랜잭션이 update 나 delete 를 한 경우 |
트랜잭션 완료 시까지 수정/삭제 제한 |
Phantom Read | T1 트랜잭션이 같은 쿼리를 두번 수행 시 첫번째 실행시에 없던 레코드가 두번째 실행시에 튀어 나오는 경우 |
T1 트랜잭션이 읽은 데이터는 T2 트랜잭션에서 갱 신, 삭제하지 못할 뿐 아니라 중간에 새로운 레코드 삽입(Insert)까지 불허 |
데이터베이스의 Isolation Level (고립수준) 유형
유형 | 내용 | 읽기 이상 현상 |
Read Uncommitted | 트랜잭션 T1이 아직 commit 하지 않은 데이터를 다른 트랜잭션 T2가 Read 하는 것을 허용 | Dirty Read 오라클은 미지원 |
Read Committed | 트랜잭션 T1이 commit 을 한 데이터만 다른 트랜잭션 T2가 Read 하는 것을 허용 | Dirty Read는 막을 수 있지만 Non Repeatable Read와 Phantom Read 는 막을 수없음 (대부분의 DBMS가 채택) |
Repeatable Read | 선택 트랜잭션 T1이 읽은 데이터는 T1이 종료될 때 까지는 다른 트랜잭션이 수정/삭제 (Update/Delete) 를 허용하지 않음 단 삽입(Insert) 은 허용 함. |
Dirty Read와 Non Repeatable Read까지는 발생을 막을수 있으나 Phantom Read 는 막을 수없음 |
Serializable | 선행 트랜잭션 T1이 읽은 데이터는 T이 종료될 때 까지 다른 트랜잭션이 수정/삭제는 물론 삽입 까지 허용하지 않음 | Dirty Read와 Non Repeatable Read와 Phantom Read 까지 모두 막을 수 있음 (완벽하지만 실제 현실적으로는 불가능에 가깝다) |
Isolation Level 과 읽기 이상 현상의 관계를 정리하면 다음과 같다
Isolation Level | Dirty Read | Non Repeatable Read | Phantom Read |
Read Uncommitted | 가능 | 가능 | 가능 |
Read Committed | 불가능 | 가능 | 가능 |
Repeatable Read | 불가능 | 불가능 | 가능 |
Serializable | 불가능 | 불가능 | 불가능 |
데이터베이스의 Isolation Level 과 동시성과의 상관관계
위에서 설명한 4가지 Isolation Level 중에서 Serializable 레벨이 가장 읽기 이상 현상을 모두 방어할 수 있는 방법이기
는 하지만 대신 그만큼 트랜잭션들이 동시에 병렬적으로 실행되지 못하고 하나씩 하나씩 실행순서대로 실행이
되기 때문에 대기시간이 늘어나고 전체적으로 performance 가 떨어 질수 밖에 없다.
반대로 Read Uncommitted 는 그냥 트랜잭션 의 수행을 동시에 수행 가능하기 때문에 동시성이 높아진다.
이렇게 Isolaton Level 과 동시성(Concurrent) 은 서로 Trade-off 관계이다.
'데이터베이스' 카테고리의 다른 글
연관규칙의 측정도구 - 지지도, 신뢰도, 향상도 (0) | 2019.09.28 |
---|---|
연관규칙 : Apriori 알고리즘 - 지지도 (0) | 2019.09.27 |
데이터베이스의 연관규칙(Association Rule) 분석 (2) | 2019.09.26 |
데이터베이스의 ACID (0) | 2019.09.23 |
수평 파티셔닝 단위 - 데이터베이스 샤드(shard). 샤딩(sharding) (0) | 2019.09.10 |