안녕하세요,
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 이 걸려야 한다고 생각했습니다.
제가 무엇을 놓치고 있는지 알려주시면 감사하겠습니다.
https://docs.microsoft.com/ko-kr/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide
한번 읽어보시면 도움이 될것 같습니다.