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 관계이다.
