- Read Uncommitted: 가장 제한이 없음. 더티 리드와 반복 읽기를 허용.
- 트랜잭션은 아직 커밋되지 않은 다른 트랜잭션에서 uncommitted 데이터를 읽을 수 있습니다.
- 트랜잭션이 아직 커밋되지 않았기 때문에 이 데이터가 동일하게 유지될 보장이 없습니다.
- Read Committed: 더티 리드는 허용하지 않지만 반복 읽기는 허용.
- 트랜잭션은 다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다.
- 즉, 트랜잭션이 진행 중이면 다른 트랜잭션이 데이터를 읽을 수 없습니다. 커밋되기 전까지 기다려야 합니다.
- Repeatable Read: 더티 리드와 반복 읽기를 허용하지 않음.
- 트랜잭션은 다른 트랜잭션이 커밋한 데이터를 읽을 수 있으며, 이 데이터에 대한 읽기 잠금을 보유합니다.
- 이를 통해 다른 트랜잭션이 데이터를 수정하려고 할 때에도 트랜잭션이 완료될 때까지 데이터가 변경되지 않도록 보장합니다.
- Serializable: 더티 리드, 반복 읽기, 그리고 팬텀 리드 허용하지 않음.
- 팬텀 리드는 트랜잭션이 시작될 때 존재하지 않았던 데이터를 읽는 경우 발생합니다.
- 이 격리 수준은 다른 트랜잭션이 획득할 수 없는 공유 잠금을 데이터에 놓음으로써 이를 방지합니다.
트랜잭션 격리 수준은 데이터 불일치를 방지하고 트랜잭션이 일관되게 실행되도록 보장합니다. 애플리케이션에 적합한 격리 수준을 선택하여 효율적이고 신뢰성 있는 실행을 보장하는 것이 중요합니다.
격리 수준
- 격리 수준
- Read Uncommited
- 한 트랜잭션의 변경된 내용을 Commit, Rollback과 상관없이 다른 트랜잭션이 읽을수 있게 함.
- 특징
- Lock유지에 드는 리소스 적음
- DeadLock.에 빠질 위험이 가장 적고 성능이 빠름
- 주의
- Dirty Read 발생 가능성 존재
- 데이터 정합성에 문제가많음 -> 되도록 사용하지 않는게 이상적
- 갱신되지 않을 과거의 자료에 사용시 권장됨
- 몇몇 행이 조회되지 않아도 될만큼 거대한 데이터를 집계시 권장됨
- 트랜잭션 도중에 값을 얻어낼 수 있으므로 복잡한 함수나 프로시저에 디버깅 용으로 사용되기도 함
- Read Commited
- Commit이 완료된 데이터만 조회가 가능하게 함
- 특징
- 다른 트랜잭션에서의 변경 사항이 커밋 되지 않은 경우 실제 테이블값이 아닌 Undo 영역의 백업 데이터에서 값을 가져옴
- Commit된 결과만 가져오기때문에 Dirty Read 발생 X
- RDB에서 대부분 기본적으로 사용됨
- 주의
- Non-repeatable Read 발생 가능
- 잠금이 발생하기에 속도나 성능에 있어서 느릴수 있음
- 트랜잭션 간 고립성 완전 보장 안함 즉 정확도가 중요하면 더 높은 격리 필요
- Repeatable Read
- 트랜잭션이 시작되기전 Commit된 데이터만 조회 가능하게함
- 특징
- Mysql 에서 기본적으로 사용
- 자신의 트랜잭션 보다 먼저 일어난 트랜잭션의 변경점 부터 보게됨
- Undo 영역에 백 해두고 실제 레코드 값 변경
- 트랜잭션이 범위 내 에서 조회한 데이터의 일관성 보장
- 이미 존재하는 영역에 대해서만 보장
- 주의
- 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정이 불가능
- 잠금의 범위가 넓어져 성능과 속도 저하
- Phantom Read 발생 가능
- Serializable
- 가장 단순하면서 엄격한 격리수준
- Insert 되는 데이터도 고려하여 격리성 유지
- 완벽한 읽기 일관성
- 한 트랜잭션이 특정 테이블을 조회할경우 다른 트랜잭션은 해당 테이블의 데이터를 추가, 변경, 삭제할 수 없음(성능 저하)
- 모든것이 순차적으로 진행되 Phantom Read 발생 X
- 거의 사용되지 않음.