예를 좀 들자면
session1
begin tran
update table1 set name='aaa' where id = 1
session2
1 . select * from table1 where id = 1 -- 락이 걸려서 실행이 안됨
2. select * from table1 where id = 2 -- 락이 걸려서 실행이 안됨
제가 궁 금한것 은 2번 입니다. 2번은 실행이 되어야 정상 아닌가요??
제가 알기로는 session1 에서는 table 락이 아닌 row 락이 걸릴 테고
그럼 session2 에서는 1번 은 id=1 에 row 락이 걸려서 당연히 실행이 안되는건 이해가 가는데
2번은 왜 실행이 안될 까요? 조언 좀 부탁 드립니다. ㅜ
참고로 sp_lock 처보면
해당 프로세스에
TAB, PAG, RID 락이 다 걸려 버리네요 ㅜ
MSSQL 의 기본적인 락의 수준이라면 READ COMMITTED 이죠.
우선 TAB, PAG 에 IX 이 걸려있을거같은데 I가 붙은건 일단 무시하셔도 될듯합니다. 다른 세션에서 락 에스컬레이션이 발생할때
충돌을 방지하는 락으로 알고있는데요. 일단 질문과는 동떨어지므로 패스
저기서 문제는 세션2에서 힙테이블을 조회하는데 있습니다.
세션1에서 아이디1 번값에 X락 이 걸립니다.
세션2에서 첫번째 쿼리는 아이디1 번값을 조회를 할려고 하니 이미 1번값은 X락이 걸려서 대기상태에 빠집니다.
세션2에서 두번째 쿼리는 아이디2 번값을 조회를 할려고 합니다. 그런데 TABLE1 테이블은 인덱스가 없는 그냥 힙 테이블이므로
처음값부터 쭈~~욱 풀스캔이 일어나는데 아이디1번값이 X락이 걸려있는 상태이므로 풀스캔을 못하고 대기에 빠집니다.
그럼 만약 세션1에서 5번아이디값을 수정하면 세션2의 쿼리는 실행할까요? 역시 안됩니다. 세션2에서 아이디값을 뭘루 조회하든
풀스캔을 해야 나오기 때문입니다.
풀스캔하지 않도록 CREATE UNIQUE CLUSTERED INDEX IDX_CL_TABLA1 ON TABLE1 (ID) 주면 결과가 틀려집니다.
해당 ROW만 조회하면 되기 때문입니다.