2012-01-30 3 views

답변

1

나는 두 개의 B + 트리 구현을 작성했습니다. 범위 쿼리의 경우 범위의 하한 경계에있는 키로 커서를 이동 한 다음 상한에 도달 할 때까지 "오른쪽으로 이동"하십시오. 리프 노드 사이에 왼쪽/오른쪽 포인터가있는 B + 링크 트리를 사용하면이 작업이 매우 간단 해집니다.

그러나 스냅 샷 격리는 구현하지 않았습니다. 나는 이것이 당신의 고립 알고리즘에 강하게 의존한다고 생각한다. 섀도우 페이지 (각 트랜잭션에 대해 수정 된 페이지의 복사본을 생성하는 곳)를 사용하는 경우 리프 노드를 따라 "오른쪽으로 이동"하기 전에 섀도우 페이지가 존재하는지 확인해야합니다.

+0

감사합니다. 이미 클러스터 된 B + 트리를 사용하여 범위 쿼리를 지원하지만 스냅 샷 범위 쿼리를 사용하면 문제가됩니다. 섀도우 페이지를 살펴 보겠습니다. –

0

"RowVersion"이라는 각 행에 숨겨진 열을 추가 할 수 있습니다. 행을 업데이트 할 때마다 현재 트랜잭션 번호로 업데이트 된 RowVersion을 사용하여 새 행을 삽입합니다. 읽을 때 거래 번호보다> = 버전이 가장 낮은 행을 선택합니다. 어떤 종류의 정리 작업이 필요할 수도 있습니다.

행 버전을 다른 위치에 저장할 수도 있습니다. 같은 B 트리에있을 필요는 없습니다. RAM 또는 서버 재시작시 다시 작성되는 임시 데이터베이스에 저장할 수 있습니다.

+0

내가 어디에서 왔는지 알지만, 일반적으로 스냅 샷 격리를 구현하는 방법에 대한 답을 얻을 수 있습니다. 클러스터 된 B + 트리 및 스냅 샷의 문제점은 잠금을 설정하지 않고 데이터 노드를 덮어 쓸 수 없다는 것입니다. @ cruppstahl의 대답은 맞습니다. 감사. –