트랜잭션 격리 수준 - Isolation level
트랜잭션 격리 수준은 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것이다
격리수준은 크게 4개로 나뉜다.
위에서 아래로 갈수록 격리수준은 높아진다.
1. 격리성 관련 문제점
1-1. Dirty Read
다른 트랜잭션에 의해 수정됐지만 아직 커밋되지 않은 데이터를 읽는 것
- 트랜잭션 A가 1번 사원의 나이를 19 → 20로 변경하고 커밋하지 않았다.
- 트랜잭션 B는 1번 사원의 나이를 조회했더니 커밋하지 않았던 20을 조회했다.
만약 트랜잭션 A가 최종커밋을 하지 않는다면, 트랜잭션 B가 가지고 있는 데이터는 꼬이게된다.
1-2. Non-Repeatable Read
트랜잭션 내에서 같은 쿼리를 두번 수행할 때 두개의 쿼리가 다른 결과를 반환하는 현상 (비 일관성)
- 트랜잭션 A는 현재 1번 사원의 나이가 19인 데이터를 조회하고 있다.
- 트랜잭션 B가 1번 사원의 나이를 19 → 20로 변경하고 커밋한다.
- 그후 트랜잭션 A가 다시 해당 데이터를 조회 하면 처음 조회랑 다른 20으로 변경된 데이터를 조회하게 된다.
1-3. Phantom Read
한 트랜잭션 안에서 일정범위의 레코드를 두번 이상 읽을 때, 첫 번재 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타나는 현상을 말한다.
- 트랜잭션 A가 특정 조건으로 데이터를 검색하여 결과를 얻었다.
- 트랜잭션 B가 해당 조건의 데이터를 삭제 혹은 추가 해버렸다,
- 다시 해당 조건으로 트랜잭션 A가 데이터를 조회하면 이전에 트랜잭션 A에서 추가/삭제된 데이터가 함께 조회/누락 된다.
이 때 트랜잭션 B가 롤백하게 된다면 데이터가 꼬이게 된다.
2. 트랜잭션 격리수준
2-1. Read Uncommitted (level 0)
어떤 트랜잭션의 처리중인 변경내용이 다른 트랜잭션에서 읽는 것을 허용한다.
- SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는다.
- 트랜잭션에 처리중이거나, 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
- 데이터베이스의 일관성을 유지는 것이 불가능하다.
발생되는 문제점
Dirty Read, Non-Repeatable Read, Phantom Read
2-2. Read Committed (level 1)
어떤 트랜잭션의 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회할 수 있다.
Oracle DBMS에서 기본으로 사용된다.
- Oracle, SQL Server
발생되는 문제점들
Non-Repeatable Read, Phantom Read
금융 시스템에서 입/출금 과 연관된 금전적인 처리와 연결되어 있다면 문제가 발생할 수 있다.
2-3. Repetable Read (level 2)
트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리수준이다.
MySQL DBMS에서 기본으로 사용한다.
- A번 트랜잭션이 500000번 사원을 조회
- B번 트랜잭션이 500000번 사원의 이름을 변경하고 커밋
- A번 트랜잭션이 500000번 사원을 다시 조회
언두 - Undo영역에 백업된 데이터 반환
즉, 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 변경된(커밋된)것만 보게 되는 것 이다.
발생되는 문제점
Phantom Read
2-4. Serializable
격리수준이 Serializable일 경우 읽기 작업에도 공유 잠금을 설정하게 되고, 이러면 동시에 다른 트랜잭션에서 이 레코드를 변경하지 못하게 된다.
- 동시처리 능력이 떨어진다.
- 성능저하가 발생하게 된다.