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 Read 발생 X)
- Non-Repeatable Read 발생 가능
- Phantom Read 발생 가능
3. Repeatable Read
- 항상 한 트랜잭션의 일관성 있는 데이터 읽기를 보장(Dirty 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
'Database > SQL Server' 카테고리의 다른 글
[MSSQL] 테이블 명세서 쿼리 / SP 명세서 (0) | 2022.08.04 |
---|---|
SQL 매월 마지막일 출력 (0) | 2019.06.20 |
B-TREE 구조 (0) | 2018.11.15 |
SQL 실행계획 (0) | 2018.11.12 |
[MSSQL] Table Column 속성 변경 (0) | 2018.06.25 |