WITH(NOLOCK)은 select 출력시 MSSQL의 격리 수준을 Read Uncommitted 으로 설정함.
( 참고로 MSSQL의 기본 격리수준(Isolation Level)은 Read Committed 이다. )
사용 방법은 select 절에서 [테이블명] 뒤에 WITH(NOLOCK)을 붙여주면 된다. ( JOIN이 들어간 경우에도 마찬가지다.)
ex) select * from table1 with(nolock)
select * from table1 A with(nolock) inner join table2 B with(nolock) on A.no=b.table1_no
사용하는 이유는 조회 속도 향상과 특히 교착상태(DeadLock)을 방지하기 위해서 이다.
예를들어 table1이 현재 작업중( Update , Delete , Insert )이라면
table1을 select 하기 위해서는 table1의 작업이 끝난 뒤여야 한다. 그동안 기다려야 하므로 시간이 걸린다.
특히 동시에 여러 사용자가 사용중이며, 여러 테이블을 조인해서 select 하게 된다면
처리 속도는 늦을 수밖에 없고 , 심지어 교착상태에 빠질 수 있다.
이러한 불편함을 방지하기 위해서 WITH(NOLOCK)을 사용하면 테이블의 작업상태 여부와 상관없이
바로 select 할 수있다.
다만, 장점이 있는 만큼 단점도 존재한다.
select 한 데이터의 정합성이 떨어질 수있다.
예를들어 WITH(NOLOCK)상태에서 현재 작업중인 table1을 select 하여 데이터를 가져오는데 ( Dirty Read )
table1을 rollback 하여 table1의 데이터가 작업전의 상태로 돌아가면 WITH(NOLOCK)으로 select 한 데이터는
현재 데이터와 일치 하지 않게 된다.
그러므로 속도보다 데이터 정합성이 더 높게 요구 되는 경우에는 WITH(NOLOCK)을 사용하지 않는게 좋겠다.
'MSSQL' 카테고리의 다른 글
[MSSQL] 자동 증가값 (IDENTITY 입력 제한) 해제 (0) | 2022.02.22 |
---|---|
[MSSQL] 트랜잭션의 격리 수준(isolation) (0) | 2022.02.18 |
[MSSQL]PARTITION by 사용 (0) | 2022.02.18 |
[MSSQL] 숫자 ->문자 / 문자 ->숫자 변환 ( Convert / Cast ) (0) | 2022.02.09 |
[MSSQL] UNION 과 UNION ALL 차이 (0) | 2022.02.07 |