h2.3. 버퍼 Lock
h3.(1) 버퍼Lock이란?
Oracle은 Row level을 Lock을 제공하기 때문에 서로 다른 Row를 변경하는 것은 문제가 되지 않는다. 하지만 두개의 Row가 같은 블록 안에 있다면 블록을 동시에 변경하는 것은 안되기 때문에 각 사용자는 개별적으로 Row 변경을 위해 TX Lock을 Exclusive하게 획득했다 하더라도 한 한명의 사용자 만이 블록을 변경하고 있다는 것을 보장 받아야 한다. 이 경우에 획득해야 하는 Lock을 Buffer Lock이라 한다.
만일 Buffer Lock을 획득하지 못하면 다른 Lock들과 마찬가지로 Lock을 획득할 때까지 대기해야 한다.
버퍼Lock을 획득 했다면 래치를 곧바로 해제한다.
버퍼내용을 읽기만 할 때는 Share모드, 변경을 할 때는 Exclusive모드 Lock을 설정한다.
1. 변경하고자 하는 Row에 해당하는 Block 이 존재하는 위치에 찾아가기 위해 cache buffer chains latch를 획득한다.
2. Block을 찾은 해당 Buffer에 대해 Buffer Lock을 획득하고, cache buffers chains latch를 해제한다.
3. 해당 Row에 대해 TX Lock을 획득하고 Row를 변경한다.
4. Buffer Lock을 해제한다.
h3.(2) 버퍼핸들
h3.(3) 버퍼Lock의 필요성
h3.(4) 버퍼 Pining
Pining의 사용 예
인덱스를 경유해 테이블을 액세스 할 때 인덱스 클러스트링 팩터가 좋다면 같은 테이블 블록을 반복 액세스할 가능성이 크다. (8i)
NL 조인시 Inner테이블을 룩업하기 위해 사용되는 인덱스 루트블록.(9i)
Index Skip Scan에서 브랜치 블록을 거쳐 리프 블록을 액세스 하는 동안. (9i)
NL 조인시 Inner테이블의 인덱스 루트블록 뿐만 아니라 다른 인덱스 블록에 대해서도 Pining을 함. (9i)
DML 수행시 Undo레코드를 기록하는 Undo블록.