안녕하세요,

SQL 에 관련해 궁금한 사항이 있어서 질문 드립니다.

아시는 분은 꼭 답변 해주시면 감사하겠습니다.


제가 알기로는 Update, Insert 중 같은 테이블을 Select 시도하면 Lock 이 걸린다고 알고있습니다.

실제로 Begin Tran Update ~ 로 Commit 전의 상태에서

Select 문을 사용했을 때 Lock 이 걸려 Timeout 에러가 발생하는 것 까지 확인하였습니다.

그래서 이 때 Lock 없이 데이터를 보기 위해서는 Select 문에 WITH(NOLOCK) 을 사용하면 되고,

이 또한 테스트로 확인했습니다. ( NOLOCK 사용 시 Update 중에도 Select 되는 것)


그런데 테스트 중 Join 으로 Select 한 테이블은 Lock 이 발생하지 않고 Select 결과가 나타났습니다.

좀 더 자세하게 상황을 설명하면,

A, B : Table

Update A 중

Select From A INNER JOIN B ON A.type = B.type WHERE A.type = 'TEMP'

의 결과가 WITH(NOLOCK) 없이 바로 나왔습니다.


왜 이 경우에는 트랜잭션이 걸리지 않을까요?

위 상황에서 DBCC OPENTRAN 으로 확인했을 때 Update A 로 열린 트랜잭션이 여전히 있었는데 말입니다.


제 생각으로는 Join 도 역시 테이블들을 조회해 join 후 가상의 테이블로 보여주기때문에

테이블 조회하는 과정에서 Lock 이 걸려야 한다고 생각했습니다.


제가 무엇을 놓치고 있는지 알려주시면 감사하겠습니다.