울음참고 개발공부
article thumbnail
728x90

 

 

 

 

 

 

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) 은 정확성이 필요한 경우에는 사용하지 말아야한다.

 

 

 

https://ryean.tistory.com/32

 

[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

 

 

 

 

 

 

 

 

 

728x90
profile

울음참고 개발공부

@메각이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!