메뉴 건너뛰기


Developer > DBMS
MS SQL Server의 Transaction 기본 격리 수준(isolation level)이 read commiteted입니다. 그래다 보니 MS SQL에 특별한 처리를 해 주지 않으면 Select문 수행시 Shared Lock이 설정되어 해당 테이블에 insert나 update와 같은 작업이 block되게 됩니다.
이와 같은 행동을 취하는 것은 데이터의 안전한 열람을 위해서 이죠. 즉, 읽고 있는 동안 데이터가 변경되는 것을 막기 위한 것인데...
은행의 계좌 정보와 같이 실시간성이 중요시되는 데이터가 아닌 일반적인 경우에는 데이터를 읽는 중 좀 수정되더라도 크게 문제가 되질 않는 경우가 많습니다.
이런 경우라면 insert나 update와 같은 작업이 Block되지 않게 하기 위해 select문 수행시 락을 걸지 말라는 힌트를 MS SQL에 줄 수 있습니다.
 
방법은 from절의 테이블 뒤에 "WITH (NOLOCK)" 과 같은 문장을 덧 붙여 주면 되는데...
WITH를 생략해도 상관없습니다. 예를 들면 다음과 같습니다.
 
select * from T1 A (NOLOCK) LEFT OUTER JOIN T2 B (NOLOCK) ON A.KEY=B.KEY
프로시져같은 경우 프로시져의 도입부분에 다음과 같은 문장을 입력하면 된다고 하는데....
이것은 저도 해보질 않아서... ^^;
 
set transaction isolation level read uncommitted
 
 
WITH (NOLOCK) 외에도 NOLOCK 대신에 ROWLOCK, UPDLOCK을 사용할 수 있습니다.
 
MS SQL은 기본적으로 행단위 Lock이 걸리는데 필요시 페이지, 테이블 락으로 승격되어 사용되게 되는데 이럴 때 ROWLOCK을 사용하면 승격되지 않도록 합니다. 즉, ROWLOCK은 행단위 락으로 고정한다는 의미입니다.
 
UPDLOCK은 대상 테이블에 배타적락(Exclusive Lock)을 설정하도록 합니다.
일반적으로 select를 하고 바로 update를 하고 싶은 경우 다른 사용자의 update문에 의해 간섭받지 않도록 하고 싶은 경우 사용합니다.
 
다음을 참고하세요.
 
 
그리고 한가지 더... Sybase와 MS SQL이 출신이 같은건 아시죠?
그런 이유로 Sybase도 Select문 수행시 Shared Lock이 걸리게 되는데...
Sybase의 경우는 Select문 제일 뒤에 "isolation 0" 을 적어 주시면 됩니다.
 
select * from T1 isolation 0
 
이런식이죠... 뭐...
도움이 되셨길... ^^;


Creative Commons License
Creative Commons License이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
Copyright 조희창(Nicholas Jo). Some rights reserved. http://bbs.nicklib.com