SELECT 문 사용할 때 with(nolock)를 사용하는 경우가 종종 있다.
with(nolock)을 사용하는 이유는 트랜잭션 격리성 때문인데 해당 내용에 대해 정리 글
Transaction Isolation Level(트랜잭션 격리 수준)이란?
- A 트랜잭션이 실행되고 있을 때 다른 B 트랜잭션의 접근 권한에 대한 수준을 이야기 합니다.
- 트랜잭션 격리 수준 단계가 높아질수록 격리 수준이 높아지며 데이터 일관성은 높아지지만 동시성은 저하 됩니다.
Transaction Isolation 관련 문제점
- Dirty Read : 커밋되지 않은 데이터를 읽어 해당 트랜잭션이 롤백 되면 오류 데이터를 읽을 수 있는 문제점
- Non-Repeatable Read : 한 트랜잭션이 반복하여 Read 중일 때 다른 트랜잭션이 접근하여 데이터를 변경하여 커밋하여도 커밋된 결과가 반영 되지 않는 문제점
- Phantom Read : 한 트랜잭션 안에서 일정 범위 레코드를 두번 이상 읽을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 문제점
Transaction Isolation Level 단계
1. Read Uncommitted
- 트랜잭션 실행 중 다른 트랜잭션이 접근 가능(트랜잭션이 격리되지 않음)
- A트랜잭션이 데이터를 변경 중 일 때 B트랜잭션이 접근하여 커밋되기전 변경된 데이터를 읽을 수 있음.
- 만약 커밋되지 않고 A트랜잭션이 롤백되면 B트랜잭션의 결과값은 잘못된 데이터가 됨(Dirty Read 발생 )
- Non-Repeatable Read 발생 가능
- Phantom Read 발생 가능
2. Read Committed
- 커밋되기 전 바뀐 데이터를 읽을 수 없음.(Dirty R ead 발생 X )
- Non-Repeatable Read 발생 가능
- Phantom Read 발생 가능
3. Repeatable Read
- 항상 한 트랜잭션의 일관성 있는 데이터 읽기를 보장(D irty Read, Non-Repeatable Read 발생 X )
- A트랜잭션 실행 중 B 트랜잭션에서 Insert가 발생 후 동일 조건의 Select문의 A트랜잭션과 B트랜잭션의 결과가 달라짐 (Phantom Read 발생 )
- A트랜잭션이 실행 중일 때 다른 트랜잭션이 DB의 내용을 변경해도 서로 영향을 미치지 않는다.
4. Serializable
- 가장 높은 격리 수준
- 트랜잭션이 완료될 때까지 Select 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 트랜잭션이 접근 불가
- Dirty Read, Non-Repeatable Read, Phantom Read 모두 발생 안함.
위 내용을 아래 표로 정리하였습니다.
Dirty Read
Non-Repeatable Read
Phantom Read
Read Uncommitted
O
O
O
Read Committed
X
O
O
Repeatable Read
X
X
O
Serializable
X
X
X
* DB별 Default isolation
DB
Default isolation
MSSQL
Read Committed
MYSQL
Repeatable Read
ORACLE
Read Committed
격리 수준과 with(nolock) 힌트의 관계
- With(nolock) 힌트는 격리성 제한이 걸린 DataBase 의 Read Uncommitted 를 허용한다.(격리성 관련 문제점 발생)
- 격리성 제약조건 있는 DB 에 실시간으로 데이터를 확인할 때 주로 사용한다.
- 데드락이나 교착상태가 발생하지 않는다.
- Rollback 이 될 수 있는 데이터까지 읽기 때문에 데이터 일관성은 저하된다.
*with(nolock)과 유사한 with(readuncommitted)힌트도 있습니다~!
*본문에 사용된 이미지 출처 : https://lng1982.tistory.com/287