데이터베이스 개발자 질문과 답변 게시판
데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.
안녕 하세요 mssql 초보 입니다
lock 관련 질문이 있습니다
mssql도 오라클과 같이 rowlock 이 디폴트로 알고 있습니다
그렇다면
create table kjw( a int)
insert into kjw
values(1)
insert into kjw
values(2)
insert into kjw
values(3)
실행후
begin tran
update kjw
set a = 10
where a = 1
다음과 같이 update를 실행한 다음
다른 세션에서
select a from kjw
where a = 2
다음과 같이 실행하면 blocking이 안 걸려야 하는거 아닌가요?
lock 잡은 세션에 대한 정보는 다음과 같습니다
sp_lock 54
54 5 0 0 DB S GRANT
54 5 702625546 0 PAG 1:306 IX GRANT
54 5 702625546 0 RID 1:306:0 X GRANT
54 5 718625603 0 TAB IX GRANT
54 5 702625546 0 TAB IX GRANT
현재 이것이 table lock으로 잡혀 있는 것 같은데 왜 그런건지 궁금합니다 ㅠㅠ
Comment 1
-
방랑도사
2013.01.17 19:19
락모드가 x인것만 보시면됩니다. 힙에서는 RID 는 로우락 맞구요. PK가 설정되어있다면 KEY로 뜨겠죠. IX는 인텐트락이라고 해서 다른 세션에서 페이지락이나 테이블락을 걸지못하게 하는 락입니다. MSSQL에는 락 에스컬레이션이라고 해서 작업의 범위가 클경우
락 범위가 상승하는데, 그로인한 다른 세션에서의 락과 충돌을 방지하는역활을 하는게 인텐트락입니다.
두번째 세션에서 SELECT 구문을 수행할때 다른 값을 조회하는데도 락이 걸린 이유는 힙에서는 테이블스캔을 하기 때문입니다.
즉 where a = 2 로 주었지만 a가 1인값부터 순차적으로 테이블스캔을 해나가는데 1인값이 x락이 걸려있기에 조회가 안되는 거지요.
만약 pk를 준다면 조회시 테이블스캔을 안하기에 조회가 될겁니다.