MSSQL 에서 WITH(NOLOCK) 을 사용하는 경우
MSSQL 은 기본적으로 SELECT 시 공유잠금(S Lock) 이 걸린다.
이는 MSSQL 의 기본 격리수준(Isolation Level) 이 Read Committed 이기 때문이다.
즉, DML(INSERT, UPDATE, DELETE) 작업중인 ROW 또는 TABLE 에 SELECT 할 경우,
해당 작업이 끝나야 SELECT 할 수 있다는 의미이다.
만일 이렇게 수행된다면 DB의 성능은 떨어지고, 데드락(Deadlock) 이 발생될 수 있다.
이를 방지하기 위해 WITH(NOLOCK) 을 사용할 수 있다.
WITH(NOLOCK) 의 격리수준(Isolation Level)은 Read Uncommitted 와 같다고 보면 된다.
즉, SELECT 할 ROW 또는 TABLE 이 잠겨있어도(작업중이여도) 기다리지 않고 조회 (Dirty Read) 하겠다라는 의미이다.
이를 통해 조회 성능이 올라가고, 데드락(Deadlock) 을 방지할 수 있다.
그러나 Committed 되지 않은 데이터를 읽기 때문에 트랜잭션이 Rollback 될 경우,
잘못된 데이터를 읽게 될 수도 있다. (정합성이 떨어진다.)
고로, WITH(NOLOCK) 은 정확성이 필요한 경우에는 사용하지 말아야한다.
[SQL Server / MS-SQL] WITH(NOLOCK) 사용법, 주의할 점, 공유잠금
MSSQL 은 기본적으로 SELECT 시 공유잠금(S Lock) 이 걸린다. 이는 MSSQL 의 기본 격리수준(Isolation Level) 이 Read Committed 이기 때문이다. 즉, DML(INSERT, UPDATE, DELETE) 작업중인 ROW 또는 TABLE 에 SELECT 할 경우, 해
ryean.tistory.com
트랜잭션의 격리 수준
READ UNCOMMITTED
- 각 트랜잭션에서의 변경 내용이 COMMIT이나 ROLLBACK 여부에 상관 없이 다른 트랜잭션에서 값을 읽을 수 있다.
- 정합성에 문제가 많은 격리 수준이기 때문에 사용하지 않는 것을 권장한다.
그렇다면 READ UNCOMMITTED는 문제가 없을까?
- DIRTY READ현상 발생
- 트랜잭션이 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상
READ COMMITTED
- RDB에서 대부분 기본적으로 사용되고 있는 격리 수준이다.
- Dirty Read와 같은 현상은 발생하지 않는다.
https://nesoy.github.io/articles/2019-05/Database-Transaction-isolation
트랜잭션의 격리 수준(isolation Level)이란?
nesoy.github.io
'MSSQL' 카테고리의 다른 글
bad SQL grammar []; nested exception is java.sql.BatchUpdateException: 키워드 'OPTION' 근처의 구문이 잘못되었습니다. (0) | 2024.10.17 |
---|---|
MSSQL | DATETIME 타입 공백 표시 - CONVERT(),COALESCE(), ISNULL(), IS NULL (0) | 2023.10.24 |