@Transactional(readOnly=true)와 with(NOLOCK) 차이

연어는결국강으로·2023년 5월 22일
0

DB 공부

목록 보기
2/5

회사에서 mssql 쿼리를 보다가 with(nolock) 구문을 보게 되었다. 뭔지 보니까 mssql에서 사용되는 힌트라고 한다. 얘는 보통 select를 할 때, 다른 트랜잭션에 대한 lock을 피하기 위해 사용된다고 한다.

일반적으로 sql server에서는 한 트랜잭션이 데이터를 읽을 떄 해당 데이터에 대해 잠금을 설정한다. 이로 인해 다른 트랜잭션이 데이터를 수정하거나 삭제하는 동안 대기해야 할 수 있다. 이는 데이터의 일관성과 무결성을 보장하기 위해 필요한 기능이다.

그런데 with(nolock) 힌트를 사용하면 현재 읽는 쿼리에서 다른 트랜잭션에 대한 잠금을 요구하지 않는다. 이는 다른 트랜잭션과의 충돌을 피하고 읽기 성능을 향상시킬 수 있는 장점이 있다. 그러나 이 힌트를 사용하면 다른 트랜잭션에서 수정중인 데이터를 읽을 수 있으므로, 일관성에 대한 보장이 제한될 수 있다.

with(nolock)은 보통 데이터의 일관성보다는 읽기 성능을 우선시하는 상황에서 사용한다. 덧붙이면 데이터의 정확성과 일관성이 중요한 작업이라면 사용하지 않는 것이 좋다. 다른 격리 수준인 READ COMMITTED나 다른 방법을 고려하는게 좋다.

그렇다면 Spring에 있는 @Transactional(readonly=true)랑 같은건가? 둘은 비슷하지만 다르다.

  • 범위 : @Transactional(readonly=true)는 메서드나 클래스에만 적용된다. 반면에 WITH(NOLOCK)은 Sql Server에서 사용되는 힌트로 SQL 쿼리 내에서 사용된다.
  • 영향 범위 : @Transactional(readonly=true)은 일반적으로 여러 개으 ㅣ데이터베이스 작업을 묶어 하나으 ㅣ트랜잭션으로 관리하는 데 사용된다. readonly=true 속성은 해당 트랜잭션이 읽기 전용으로 동작하도록 지정한다. 이는 모든 db작업에 적용된다. 반면에 WITH(NOLOCK)은 개별 SQL 쿼리에 대한 힌트로 사용되며, 해당 쿼리에서만 읽기 전용으로 동작하도록 지정한ㄷ.ㅏ
  • 잠금 방식: @Transactional(readonly=true)는 db 트랜잭션에서 읽기 작업을 수행할 때, 일반적으로 데이터에 공유 잠금(Shared Lock)을 설정하지 않는다. 이는 다른 트랜잭션이 동일한 데이터를 동시에 읽을 수 있도록 허용한다. WITH(NOLOCK)은 SQL Server에서 데이터 읽기 작업에 대해 다른 트랜잭션에 대한 잠금을 요구하지 않는다. 이는 다른 트랜잭션의 수정 작업을 대기하지 않고 데이터를 읽을 수 있도록 허용한다. 따라서 WITH(NOLOCK)은 트랜잭션 격리 수준을 낮추는 효과가 있다

결론적으로, @Transactional(readonly=true)과 WITH(NOLOCK)은 비슷한 목적을 가지고 있지만, 적용되는 범위와 잠금 방식에서 차이가 있다. 따라서 어떤 것을 선택해야 하는지는 상황에 따라 다를 수 있으며, 데이터의 정확성과 일관성을 고려하여 적절한 방법을 선택해야 한다.

0개의 댓글