VII. Buffer Lock

1) Buffer Lock 개요

  • 여러 Session이 동시에 수정하는 것으로부터 Data Block을 보호
  • Buffer를 읽거나 쓰고자 할 경우 Share / Exclusive Mode로 Buffer Lock 획득
  • Buffer Header 정보의 User list와 Waiter list를 통해 관리
  • Data Block 수정/읽기 후 Buffer Lock 해제

오라클은 매우 정교하게 로우 레벨의 락 메커니즘을 제공하지만, 사용자의 동시 변경으로부터 데이터를 보호하기 위해 블록 단위로 락을 거는 일은 거의 없다. 그러나, 오라클의 I/O가 블록 단위로 이루어 진다는 사실 때문에 블록 단위의 락은 반드시 필요하다.
다른 사용자가 같은 블록에 있는 서로 다른 로우에 대해 변경을 하려고 할 때 논리적으로는 전혀 문제가 되지 않지만, 두 개의 로우가 같은 블록에 있다는 물리적인 제한으로 인해 블록을 변경하는 행위 자체는 동시에 이루어져서는 안 되기 때문이다.
각 사용자는 로우를 변경하기 위한 TX 락을 exclusive하게 획득했다 하더라도 현재 자신만이 블록을 변경하고 있다는 것을 보장 받아야 한다.
이 경우에 획득해야 하는 락이 버퍼 락(buffer lock)이다. 버퍼 락은 cache buffers chains 래치, TX 락과 함께 버퍼의 변경을 동기화하는 역할을 한다

참고
버퍼 락에는 (shared/exclusive) 모드가 있다.
버퍼를 읽는 과정에는 shared 모드의 락을 획득하고 변경하는 과정에는 exclusive모드의 락을 획득 해야 한다.

2) Buffer Lock 처리 방법

추상적인 레벨에서, 하나의 로우를 변경하기 위해서 래치나 락을 획득하는 과정은 다음과 같다.

  1. 변경하고자 하는 블록을 해쉬 체인에서 탐색하여 찾게 되면 대상 버퍼 헤더에 버퍼 락을 exclusive모드로 획득한다.
  2. 버퍼 헤더에 대해 버퍼 락을 획득하고 나면 원하는 로우에 TX 락을 획득한 후 버퍼를 변경한다
  3. 버퍼를 수정하는 동안 다른 세션은 버퍼 락을 대기하고, 버퍼를 수정한 후 버퍼 락을 해제한다.

문서에 대하여