트랜잭션이란?
데이터베이스 관리 시스템에서 상호작용의 단위 / 어떤 요청이 끝난 상태
데이터베이스 기능 중 가장 큰 기능 임.
쿼리 하나가 실패하면, 데이터베이스 시스템은 전체 트랜잭션 또는 실패한 쿼리를 롤백한다.
트랜잭션의 4대 특징 ACID
1. 원자성(Atomicity) : 무조건 전부 성공하거나, 전부 실패해야함
COMMIT : 처리 확정
ROLLBACK : 문제 발생 시 첫 과정 직전 상태로 복귀
2. 일관성(Consistency) : 데이터 조작 전후에 일관성 유지 필요
3. 고립성(Isolation) : 여러 사용자가 동시에 데이터 조작을 실행할 경우 각 처리가 모순 없이 실행되어야함.
4. 지속성(Durability) : 한번 데이터가 변하면 그 상태를 유지하는 것.
트랜잭션이 Commit 되고 나면, 데이터 변동 사항이 영구적으로 확정되어야함.
트랜잭션 고립성의 중요성
사용자 A와 B가 영화를 예매할 때, A가 선택한 좌석을 취소할 때 까지 다른 사용자가 선택할 수 없어야함.
트랜잭션 격리 수준
ANSI 표준 격리 수준
1. Read Uncommitted : 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
성능과 동시성은 좋지만, 데이터 정확성이 떨어진다.
2. Read Committed : 트랜잭션이 Commit이 확정된 데이터만 다른 트랜잭션이 읽도록 허용 (Oracle)
3. Repeatable Read : 반복 읽기
쿼리를 2번이상 수행할 때, 첫 번째 쿼리의 레코드가 바뀌거나 사라지는 것을 방지.
ex ) A가 트랜잭션 처리를 마칠 때 까지 B가 접근하지 못하게 lock을 잡고있다.
4. Serializable : 직렬화 가능
쿼리를 2번이상 수행할 때, 첫 번째 쿼리의 레코드가 바뀌거나 사라지는것 + 새로 추가도 안됨
누군가 작업 중일 때, 데이터를 새로 넣지도 못하게함.
가장 이상적인 격리 수준은 Serializable임
but) 동시성이 크게 떨어져 성능도 안좋아짐. 그래서 Serializable은 잘 사용하지 않는다.
격리 수준이 완화되면서 직렬화 가능에서는 없었던 현상들이 발생함
1. Dirty Read : Dirty 읽기
어떤 트랜잭션이 Commit 되기 전 다른 트랜잭션에서 데이터를 읽어버림.
변경 된 트랜잭션이 최종 롤백 된다면? 그 값을 읽은 트랜잭션은 비 일관된 상태에 놓이게된다.
2. Non-Repeatable Read : 애매한 읽기 / 이전에 읽은게 달라져서나옴
A가 읽는 중에 B가 데이터를 수정해버리면, A가 다시 읽었을 때 데이터가 변해버림
같은 쿼리를 2번 수행했는데, 그 사이에 값이 수정되는 바람에 두 쿼리 결과가 다르게 나와버리는 현상
3. Phantom Read : 유령 읽기 / 데이터가 나타나거나 사라짐
같은 쿼리를 2번 수행했는데, 그사이 없었던 데이터가 추가되어 유령(Phantom) 레코드가 두번째 쿼리에 등장
격리 수준과 현상 발생 가능 여부
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
Read Uncimmutted | O | O | O |
Read Committed | X | O | O |
Repeatable Read | X | X | O |
Serializable | X | X | X |
LOCK : 트랜잭션 데이터를 수정 중이라는 사실을 알리는 방법의 잠금 장치
A가 데이터를 사용하고 있을 때, B가 접근하지 못하게 함.
데이터베이스는 동시성을 제공하면서 일관성을 제공하기 때문에 LOCK이 필수적이다.
공유락 : A가 공유락을 걸면, B는 READ는 가능하다.
배타락 : A가 배타락을 걸면, B는 READ도 못함.
데드락 : A가 1번 데이터에 락을 걸고, 2번 데이터에 대기중 / B가 2번 데이터에 락을 걸고, 1번 데이터에 대기중
무한대기에 빠져버리는 상황을 데드락 이라고함.
-> 이럴 때 DBMS는 작업 중 하나를 강제로 중지시켜서 해결함.
자제해야하는 트랜잭션
1. Auto Commit : Commit 과부하 유발
2. 긴 트랜잭션 : 대량 처리를 한개의 트랜잭션이 실행하는 것을 피해야함.
3. 시스템과 어플리케이션 로직에 맞는 트랜잭션 격리 수준을 조정해야함.