본문으로 바로가기

DB - Transaction

트렌잭션이란?

데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위


트랜잭션 특징


  • 원자성(Atomicity)
    • 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 된다.
  • 일관성(Consistency)
    • 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.
  • 독립성(Isolation)
    • 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
  • 지속성(Durability)
    • 트랜잭션이 성공적으로 완료되었으면, 결과는 영구적으로 반영되어야 한다.


Commit

하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산


Rollback

하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우

transaction이 정상적으로 종료되지 않았을 때, last consistent state (예) Transaction의 시작 상태) 로 roll back 할 수 있음.

 

트랜잭션의 상태

Active

 - 트랜잭션의 활동 상태. 트랜잭션이 실행중이며 동작중인 상태를 말한다.

Failed

 - 트랜잭션 실패 상태. 트랜잭션이 더이상 정상적으로 진행 할 수 없는 상태를 말한다.

Partially Committed

 - 트랜잭션의 Commit 명령이 도착한 상태. 트랜잭션의 commit이전 sql문이 수행되고 commit만 남은 상태를 말한다.

Committed

 - 트랜잭션 완료 상태. 트랜잭션이 정상적으로 완료된 상태를 말한다.

Aborted

 - 트랜잭션이 취소 상태. 트랜잭션이 취소되고 트랜잭션 실행 이전 데이터로 돌아간 상태를 말한다.

Partially Committed 와 Committed 의 차이점

 - Commit 요청이 들어오면 상태는 Partial Commited 상태가 된다. 이후 Commit을 문제없이 수행할 수 있으면 Committed 상태로 전이되고, 만약 오류가 발생하면 Failed 상태가 된다. 즉, Partial Commited는 Commit 요청이 들어왔을때를 말하며, Commited는 Commit을 정상적으로 완료한 상태를 말한다.

트랜잭션을 사용할 때 주의할 점

트랜잭션은 꼭 필요한 최소의 코드에만 적용하는 것이 좋다. 즉 트랜잭션의 범위를 최소화하라는 의미다. 일반적으로 데이터베이스 커넥션은 개수가 제한적이다. 그런데 각 단위 프로그램이 커넥션을 소유하는 시간이 길어진다면 사용 가능한 여유 커넥션의 개수는 줄어들게 된다. 그러다 어느 순간에는 각 단위 프로그램에서 커넥션을 가져가기 위해 기다려야 하는 상황이 발생할 수도 있는 것이다.

 

DB - Transaction Isolation - (출처 : it-license.tistory.com/25)

데이터베이스의 읽기 이상 현상 (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  관계이다.

 

CS 공부DataBase (재정리)카테고리의 다른글

Index 인덱스  (0) 2021.04.11
DB의 key  (0) 2021.04.11
SQL, noSQL  (0) 2021.04.11
정규화, 반정규화  (0) 2021.04.07
DataBase란?  (0) 2021.04.07