테스트 중인데 set transaction isolation level 0 select * from TB_TEST HOLDLOCK sp_lock isolation level이 1일때는 lock으로 나타나는데 isolation level이 0일때는 lock으로 안나타나는군요 락을 발생 안시킨다고 생각이 들긴 하는데 확답이 필요해서요 ㅎ isolation 0에서는 Shared Lock을 발생시키지 않나요?
holdlock / readpast /noholdlock /select into 키워드들은 는 isolation level 0에서 무시되던가 동작을 안할텐데요...>.<
Warning 메세지가 나오지 않던가요?
Dirty read 가 락은 잡지 않지만, 반면, commit 되지 않는 데이타를 읽어 오는
것이라서 예상치 못한 값을 읽어 올 수 있으니 주의해서 쓰심이 ^^
아.. 답변 참 감사하고요 WARNING: An explicit or implicit HOLDLOCK/NOHOLDLOCK/READPAST was specified for table 'TB_TEST'; however, since this is an isolation level 0 scan, the HOLDLOCK/NOHOLDLOCK/READPAST is ignored. 이게 발생하긴하는군요... HOLDLOCK은 무시된다라... 제가 궁금한건... 1. select.... at isolation 1 <== 100초짜리 쿼리 2. insert <== 한건 3. select.... at isolation 1 <== 1초짜리 쿼리 이런 순서대로 들어온다면 1번중에 2번은 shared lock 때문에 락이 걸리고 3번은 2번으로 인해 exclusive lock으로 락이 걸려서 결국 1번이 끝날때까지 기다려야 하는거 같아서 1. select.... at isolation 0 <== 100초짜리 쿼리 <== isolation 0으로 변경 2. insert <== 한건 3. select.... at isolation 1 <== 1초짜리 쿼리 로 하게 되면 1번이 락을 발생 안시켜서 2번이 아무문제 없이 insert에 성공하고 3번도 바로 나타나지 않을까 라는 생각을 하게 되서 질문을 드렸습니다. 결국 제가 궁금한건 select.... at isolation 0 는 shared lock을 발생시키지 않는가 입니다.
네. (Dirty Read == UnCommited Read == select .. at isolation 0 )
원래 insert시에 ex 락이 발생해서 select가 안되지만 lsolation 0로 하면 dirty read이므로 select가 됨 당연 shared lock 발생하고요 위의 순서대로 1. 진행중 2.진행중이라도 3번은 됩니다. select시에는 insert 대기하나, select시 select는 됩니다. 2. isolation 0로 select 하실때는 clustered index가 있어야 합니다.