728x90
반응형
SMALL

데이터베이스의 교통 신호등

데이터베이스의 목적중에 가장 큰 것은 데이터의 공유라고 할 수 있다.
따라서 데이터베이스는 여러 사용자가 동시에 접근해서 데이터를 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  관계이다.

 

728x90
반응형
LIST
728x90
반응형
SMALL

데이터베이스는 혼자 쓰는 공간이 아니기 때문에 당연히 여러 사용자가 동시에
접근해서 읽기,수정하기,삭제하기 등의 Transaction을 마구잡이로 실행한다.
따라서 정확한 교통정리가 없으면 데이터베이스의 데이타는 정합성이 깨지면서
데이터는 엉망이 되고 말것이다.
그레서 데이터베이스에서는 Transaction 에 대한 4원칙 즉 ACID를 따르도록
되어 있으며 이 ACID를 보장하기 위해서는 Isolation Level (격리수준) 을 결정해서
적용해야 한다.

Transacton 이란?

데이터베이스에서 트랙잰션(Transaction) 이란 데이터에 대한 하나의 논리적 실행 단계를
말한다.  좀 어려운 용어정의인데.. 예를 들자면  계좌이체를 생각해 보면 계좌이체는
A라는 송신자 통장에서 돈을 빼서 B라는 수신자의 통장에 돈을 넣는 2가지 단계로 
이루어 지듯이 이 두단계에서 데이터에 대한 처리를 하는 논리적 행위를 트랜잭션
(Transaction) 이라고 한다.
그런데 만약 A송신자 통장에서 돈만 빠져나가고 B 수신자 통장에는 오류가 나서 돈이
안들어 왔다면 정말 큰일이다. 따라서 트랙잭션은 이 다음에 설명할 ACID 를 반드시
충족해야 한다.

ACID 란?

위 에에서 설명한 계좌이체 거래(트랜잭션,Transaction) 는 아래 4가지 원칙을 만족해야 한다.

종류 내용
Atomicity (원자성)

하나의 Transaction은 모두 수행되거나 모두 수행되지 말아야 한다. 
Commit ,Rollback 을 통해 모두 적용되거나 모두 취소되어야 한다.
수행 중간에 오류가 있으면 이미 한것도 모두 취소가 되어야 한다.
계좌이체 트랜잭션(Transaction) 에서 보면 A통장에서 돈인 인출되고
B통장에 돈이 입금되는 두 행위가 둘다 모두 성공하거나 아니면 둘다 모두
취소되어야 한다는 뜻이다.

Consitency (일관성)

트랜잭션(Transaction) 실행이 성공적으로 완료되었을 때에는 
이전의 상태와 실행후의 상태가 안정적이고 일관성(Consistency)이 있어야
한다는 뜻이다.
위 계좌이체에서 A통장에 3,000원이 있었고 B통장에는 2,000 원이 있었다면
총 합계는 5,000원이 된다.  이상태에서 500원을 A통장에서 B통장으로 이체
했을 경우 A통장은 2,500원이 되고 . B통장은 2,500원이 되고 총 합계는
트랜잭션 수행되기 이전인 5,000원과 동일해야 한다는 뜻이다.
(머 당연한 이야기이겠지만...) 

Isolation (고립성) 트랜잭션(Transaction) 간에는 서로 독립성이 있어야 한다는 뜻이다.
예를 들어 계좌이체에서 A통장에 5,000원이 있는 상태에서 B통장에 3,000원
을 이체하는 트랙잰션 도중에 A통장에서 4,000원을 인출해서 C통장에
이체하는 거래가 끼어드는 경우.. 어떻게 될까?? 이 고립성(Isolation)을 
만족시키지 못한다면 A통장에서 B통장으로 3,000원 , C통장으로 4,000원이
나가는 ...자기 통장잔액 5,000원 보다 더 많은 7,000원이 나가는 사태가 
발생할 것이다. 그러면 총합계도 틀어지면서 일관성(Consistency) 도 충족하지
못하게 되는 것이다. 
그러면 이때에는 어떻게 해야할까??. 첫번째 트랜잭션이 Commit 이나 Rollback 이 되기전까지는 두번째 트랜잭션은 기다려야 한다..

Durability (영속성/지속성) 성공적으로 수행이 완료된 트랜잭션의 결과는 영원해야 한다는 뜻이다.
즉 시스템에 장애가 발생해도 그 결과는 유지되어야 한다는 뜻이다.
이러한 것을 해주는 것이 데이터베이스의 복구 기능이다.


ACID와 데이터베이스 관계

구분 관계
Atomicity (원자성) Commit / Rollback
회복성의 보장

트랜잭션은 분해가 불가능한 논리적  최소 단위로 실행 전체가 승인되거나 취소 되어야 함. (All or Nothing)

Consitency (일관성) 무결성 조건 
동시성 제어

트랜잭션의 수행 이후 데이터는 무결성이 유지되고 모순되지 않아야 함.

Isolation (고립성) Isolation Level (고립수준)
분산 트랜잭션
Lock

다수의 트랜잭션이 동시에 수행되더라고 개별 트랜잭션의 결과에 영향을 미쳐서는 안됨.

Durability (영속성/지속성) 회복기법 (Redo/Undo)

성공적으로 수행된 트랜잭션은  해당 요인에 의해 변경 및 손실되지 않아야 함.

 

728x90
반응형
LIST

+ Recent posts