Parallel Execution (Parallel Replay)

커밋이 온 트랜잭션은 반영을 할 수 있으면 반영을 하고, 반영을 할 수 없으면 큐에서 대기하게 된다. 반영 가능 여부는 반영하고자 하는 트랜잭션과 반영 중인 트랜잭션 간의 의존성 체크를 통해 서로 독립적일 경우 반영이 가능하다고 판단한다.

의존성 체크는 Table과 Row 단위 모두 확인을 한다. 트랜잭션은 레코드로 이루어져 있고, 레코드에는 본인이 건드리는 Row가 정해져 있기 때문에, 해당 데이터를 기반으로 다른 트랜잭션과 의존 관계인지 여부를 판단한다.

의존성 확인 동작은 Hash Table과 Linked List로 관리가 되고 있다. Table 단위로 Hash Table을 확인하고, Table이 확인되면, 해당 위치에 존재하는 다음 Hash Table에서 Row를 확인한다. 이 위치엔 Linked List가 존재하며, 트랜잭션은 해당 List에 의존성 객체(TX Dependency )를 달아 놓는다.

이 동작을 통해 트랜잭션이 건드리는 모든 Row에 대한 Linked List에 TX Dependency가 등록이 된다. 반영 중인 트랜잭션이나 반영 대기 중인 트랜잭션 모두 이 구조 안에서 관리된다.

반영 가능 여부는 트랜잭션의 모든 TX Dependency가 Linked List의 front에 존재하는 지의 여부로 확인한다. 하나라도 front에 존재하지 않는다면 반영이 불가능하고, 앞서 반영 중인 트랜잭션의 완료를 대기하게 된다.

그림 1. 반영이 가능한 경우

반영이 가능한 경우는 위 그림과 같이 모든 의존성 체크를 했을 때 Linked List 상에 TX Dependency 가 가장 앞선 경우이다.

그림 2. 반영이 불가능한 경우

만약 위 그림과 같이 xid: 111인 트랜잭션이 아직 반영이 끝나지 않았다면 대기하게 된다. 반영이 완료된 트랜잭션은 위 Linked list에서 제거가 되고, xid: 112가 반영 가능하게 되면 반영 작업을 진행한다.

참고

의존성 판단 기준

그림을 보면 확인이 가능하듯이, Row 단위의 비교가 가능해야 한다. 오라클과 티베로와 같은 RDBMS 에는 ROWID라는 Row별 고유 식별자가 존재한다. (다른 RDBMS에선 다른 데이터가 사용된다.)

ROWID를 구성하는 요소는 데이터 파일 번호, 데이터 파일 내 블락 번호, 블락 내 Row데이터 위치로 구성이 되고 이 데이터는 Row의 고유 ID가 된다. ProSync는 기본적으로 이 데이터를 통해 의존성을 확인한다.

또한 Primary key, Foreign key 관계에 있는 두 Row데이터의 경우 시간 순서를 반드시 맞춰주어야 한다. 따라서 이 경우도 위 Row에 대한 Hash Table과는 별개의 Hash Table로써 관리가 된다.

관련 파라미터는 REPLAY_THREAD_CNT 로, 해당 값이 올라가면 병렬 세션의 수가 많아진다. 하지만 위 로직을 보면 알 수 있다시피 결국 Hash Table 내에서 Table, Row단위로 TX Dependency가 잘 풀려야 병렬 반영이 가능하다. 이로 인해 숫자를 올린다고 반드시 올린 숫자만큼 정비례하게 증가하지 못하는 경우도 발생한다.

Last updated