-
트랜잭션 격리 수준?CS 2020. 12. 11. 18:56
트랜잭션 격리 수준 이란 트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준을 말한다.
데이터베이스의 경우 ACID 특징과 같이 트랜잭션이 독립적인 수행을 하도록 한다.
따라서 locking을 통해, 트랜잭션이 데이터베이스를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 필요하다.
트랜잭션 격리 레벨의 종류 ?
1. Read Uncommitted (레벨 0) - select 수행되는 동안 해당 데이터에 shared lock이 걸리지 않는 계층
- 트랜잭션이 처리 중이거나, 아직 Commit 되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용하는 수준의 격리.
- 사용자 1이 A라는 데이터를 B로 변경하는 동안 사용자 2가 아직 완료 되지않은 트랜잭션이지만 데이터 B를 읽을 수 있다.
- 즉 데이터베이스의 일관성 유지가 어려워 진다.
2. Read Committed (레벨 1) - select 수행되는 동안 해당 데이터에 shared lock이 걸리는 계층
- 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기 하게끔 하는 격리 수준을 말한다.
- Commit이 이루어진 트랜잭션만 수행 가능하다.
- SQL 서버가 기본적으로 사용하는 수준의 격리 레벨이다.
3. Repeatable Read (레벨 2) - 트랜잭션이 완료 될 때 까지 select 문장이 사용하는 모든 데이터에 shared lock 걸리는 계층
- 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장하는 격리 수준을 말한다.
- 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정이 불가능 하다.
4. Serializable (레벨 3) - 트랜잭션이 완료될 때 까지 select 문장이 사용하는 모든 데이터에 shared lock이 걸리는 계층
- 완벽한 읽기 일관성 모드를 제공한다.
- 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능
low level isolation 을 활용할 때 발생하는 문제들.
- Dirty Read - commit 되지 않은 수정중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 떄 발생하는 경우로 트랜잭션이 종료 되지 않았는데 다른 트랜잭션으로 인해 변경사항을 보게 되는 경우.
- Non-Repeatable Read - 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 똔느 삭제하면서 두 쿼리의 결과가 상이하게 나타나는 일관성이 깨지는 현상을 말한다.
- Phantom Read - 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상을 말한다.
'CS' 카테고리의 다른 글
프로세스 vs 쓰레드 (0) 2020.12.13 CPU 스케줄링 알고리즘 (0) 2020.12.12 객체지향 프로그래밍 (OOP) (1) 2020.12.09 잡다한 CS 지식 공부 (0) 2020.12.09 Thread (쓰레드) (0) 2020.12.01