한 인스턴스에서 다른 인스턴스로 로그인하는 법을 표현하는 Database 객체(Object)
Database Link 객체를 생성하면 다음과 같은 방식으로 원격(Remote) Database의 객체에 접근할 수 있습니다.
select * from <table_name>@<database_name>;
하나의 Client가 Database Link를 통해 여러 Database와 연결되어 Transaction을 수행하게 되는데 이를 하나의 Transaction으로 묶어 처리하는 방법이 분산 트랜잭션입니다.
여러 Database에 분산되어 있는 Transaction을 하나로 묶어 전체가 Commit or Rollback 됩니다.
현재 Client가 로그인한 Database를 코디네이터(Coordinator)라고 부르는데
클라이언트가 코디네이터를 통해 Commit 명령을 수행하면
1. Prepare Phase
- Client가 수행한 Commit되지 않은 Transaction들이 속한 Database들에 Commit을 할 것인지 물어보는 과정
- 각 Database들은 YES or NO로 코디네이터에게 답합니다.
2. Commit Phase
- 모든 Database의 YES를 받을 경우 전체 Database에 대해 Commit을 진행합니다.
- 하나의 Database라도 NO를 할 경우 전체 Database에 대해 Rollback 합니다.
- Commit or Rollback은 RECO Process가 담당
각 Database가 Prepare Phase 단계에서 Commit 여부를 응답하기 전에 네트워크 장애 등의 오류가 발생하면 모든 Database들은 Rollback됩니다.
마찬가지로 Commit Phase 단계에서 Commit or Rollback 명령을 각 Database로 전송하는 과정에서 네트워크 장애 등의 오류가 발생되면 다른 Database들은 의심되는 분산 트랜잭션을 갖게 되고 Hang이 걸린 상태로 남습니다. 즉, 결과 공지를 기다리면서 그 Transaction을 유지합니다. dba_2pc_pending
view를 조회했을 때 pending이 확인된다면 RECO 프로세스가 재기능을 하지 못한 것이므로 수동으로 처리해 주어야 합니다.